Linux进程相关笔记

进程

并发应该是一手筷子,一手电话,说一句话,咽一口饭。

并行是咽一口饭同时说一句话,而这光靠一张嘴是办不到的,至少两张嘴。

进程控制块PCB

每启动一个进程,进程中有个内核区,内核区里有一个进程控制块(PCB)来维护进程相关的信息,进程控制块时一个很大很复杂的结构体,用来保存进程的各种状态,资源上限数据,进程切换时要保存和恢复的cpu寄存器信息,环境变量等等。

PS

aux和elf两种参数的区别

参考:https://blog.51cto.com/10412806/2154827

在以往操作linux查看进程中总是看到有使用 ps aux 和 ps -elf的,我本人用的最多也是ps -elf ,今天就来和大家聊聊两者之间的区别:
首先,这两个密令都可以配合grep查看进程, ps aux 来自BSD风格(不带 -),ps -elf 来自 UNIXf风格 (必须带 -),在终端下截图为证:
聊聊 ps aux 和 ps -elf   (^_^)

  • ps aux

    ps aux 是最常用的 BSD 风格选项组合,其中的 a 简单的说,表示所有关联到终端的进程,如果同时使用 x 则代表所有进程;u 表示列出进程的用户。此外,由于一些ps版本的原因,也支持了 ps -aux

  • ps -elf

    ps -elf 的 -e 代表列出所有进程,-l 代表长格式,-f 代表完整的格式,有时候也用 -F 代表超完整的格式。 不过,不同操作系统(如 Linux、BSD)的 ps 的版本和参数有很大差异,具体还是要以自己的手册而定。

  • ps ajx

    加上j参数可以看到PPID

    进程组:PGID,会话: SID

kill

  • kill -9

    无条件杀进程。

  • kill -l

    查看所有信号

fork

fork有两个返回值,但是是一个进程返回一个返回值。

父进程:返回子进程的PID

子进程:返回0

  • getpid/getppid
    • getpid 得到当前进程的PID
    • getppid 得到当前进程的父进程的PID

ecec 函数族

  • 可以让父子进程执行不相干的操作

  • 能够替换进程地址空间中的源代码.text段

    • 实现换核不换壳的功能,内容就完全被挖走了,换成另一个程序的了,后面的代码也不会在子进程中被执行
    • 执行一个另外的程序不需要创建额外的地址空间
    • 有一个运行的程序A,在A中调用另外的应用程序B
  • 使用exec函数族之前需要fork

  • 返回值

    • 如果函数执行成功,不返回
    • 如果失败,返回 -1
    • 或者执行失败通过perror(“xxx”);exit(1);打印错误信息并退出。
  • execl使用方法

    • int execl(const char path,const char arg,..);
    • path:要执行的程序的绝对路径
    • 变参arg:要执行的程序的需要的参数
    • 第一个arg:为占位作用
    • 后面的arg:命令参数
    • 参数写完之后:NULL
    • 一般执行自己写的程序

    例:

    1
    execl("/bin/ls","6666","-la",NULL);
  • execlp

    • 和execl一样参数

    • 但主要是执行系统自带的应用程序

    • 它会从环境变量里去找这个程序

    • 例:

      1
      execlp("ps","6666","aux",NULL);

进程回收

  • 孤儿进程
    • 父进程fork出子进程
    • 父进程先死,子进程还活着,被称为孤儿进程,被init进程领养,成为孤儿进程的父进程
    • 原因:为了释放子进程占用的系统资源
      • 进程结束之后,能够释放用户区空间
      • 但释放不了pcb,必须由父进程释放
  • 僵尸进程
    • 子进程死了,但父进程还在,但父进程不去释放子进程的pcb,子进程就被称为僵尸进程。
    • 僵尸进程是一个已经死掉的进程。kill -9 也没有用,他已经是死掉的了
    • 想释放僵尸进程最简单的方法,就是把它的父进程杀死。
  • 进程回收
    • wait - 阻塞函数
      • pid_t wait(int* status);
        • 返回值:
          • -1:回收失败,已经没有子进程了
          • 大于0:回收的是子进程对于的PID
        • 参数:status
          • 判断子进程是如何死的
            • 正常退出
            • 被某个信号杀死了
          • 如果对它的退出状态不关心,可以用NULL
        • 调用一次只能回收一个子进程
    • pid_t waitpid(pid_t pid,int *status,in options);
      • 函数作用:同wait函数
      • 参数:
        • pid:
          • pid == -1 等待任一子进程。与wait等效。
          • pid > o 等待进程ID与PID相等的子进程
          • pid == 0 等待其组ID等于调用进程的组ID的任一子进程
          • pid<-1 等待其组ID等于PID的绝对值的任一子进程
        • status:同wait
        • options:设置为WNOHANG,函数非阻塞,设置为0,函数阻塞
      • 返回值:
        • 大于 0 :返回清理掉的子进程ID
        • -1:无子进程
        • = 0:参数3位WNOHANG,且子进程正在运行。

附注

Linux 里很多函数是早于C的,所以会有很多不同的数据类型。

当出现XXX_t,即,有_t的数据类型,说明他是用typedef重定义的数据类型。

例如:pid_t 其实是一个unsigned int

本文标题:Linux进程相关笔记

文章作者:Yang Shuai

发布时间:2019年03月07日 - 11:03

最后更新:2019年03月08日 - 11:03

原始链接:https://ysbbswork.github.io/2019/03/07/Linux进程相关笔记/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

坚持原创技术分享,您的支持将鼓励我继续创作!