进程
并发应该是一手筷子,一手电话,说一句话,咽一口饭。
并行是咽一口饭同时说一句话,而这光靠一张嘴是办不到的,至少两张嘴。
进程控制块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 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
- 一般执行自己写的程序
例:
1execl("/bin/ls","6666","-la",NULL);execlp
和execl一样参数
但主要是执行系统自带的应用程序
它会从环境变量里去找这个程序
例:
1execlp("ps","6666","aux",NULL);
进程回收
- 孤儿进程
- 父进程fork出子进程
- 父进程先死,子进程还活着,被称为孤儿进程,被init进程领养,成为孤儿进程的父进程
- 原因:为了释放子进程占用的系统资源
- 进程结束之后,能够释放用户区空间
- 但释放不了pcb,必须由父进程释放
- 僵尸进程
- 子进程死了,但父进程还在,但父进程不去释放子进程的pcb,子进程就被称为僵尸进程。
- 僵尸进程是一个已经死掉的进程。kill -9 也没有用,他已经是死掉的了
- 想释放僵尸进程最简单的方法,就是把它的父进程杀死。
- 进程回收
- wait - 阻塞函数
- pid_t wait(int* status);
- 返回值:
- -1:回收失败,已经没有子进程了
- 大于0:回收的是子进程对于的PID
- 参数:status
- 判断子进程是如何死的
- 正常退出
- 被某个信号杀死了
- 如果对它的退出状态不关心,可以用NULL
- 判断子进程是如何死的
- 调用一次只能回收一个子进程
- 返回值:
- pid_t wait(int* status);
- 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,函数阻塞
- pid:
- 返回值:
- 大于 0 :返回清理掉的子进程ID
- -1:无子进程
- = 0:参数3位WNOHANG,且子进程正在运行。
- wait - 阻塞函数
附注
Linux 里很多函数是早于C的,所以会有很多不同的数据类型。
当出现XXX_t,即,有_t的数据类型,说明他是用typedef重定义的数据类型。
例如:pid_t 其实是一个unsigned int