进程简介
进程是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 注意:创建一个进程时,同一个程序会从进程创建的位置执行两次。
相关api pid_t fork() //#include <unistd.h> 创建进程 void exit(int status) //#include <stdlib.h> 退出进程,退出时会调用atexit注册的函数,先注册的后调用,exit函数还会按需调用fclose函数关闭打开的文件流 int atexit(void(*func)(void)) //#include <stdlib.h> 为进程注册退出时调用的函数 void _exit(int status) //#include <unistd.h> 直接退出进程
1. 进程实现
相关代码实现如下:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main1()
{
pid_t pid;
printf("create pid\n");
pid = fork();
if(pid < 0)
{
printf("create pid error\n");
}
else if(pid==0)
{
printf("this is a son progress\n");
printf("current pid: %d, the father pid:%d\n", getpid(), getppid());
}
else
{
printf("this is a father progress\n");
printf("current pid: %d, the father pid:%d\n", getpid(), getppid());
}
printf("main fun exit \n");
return 0;
}
执行结果如下:
2. 孤儿进程和僵尸进程
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。 补充: 特殊的孤儿进程-------守护进程,一个守护进程的父进程是init进程,因为它真正的父进程在fork出子进程后就先于子进程exit退出了,所以它是一个由init继承的孤儿进程。守护进程是非交互式程序,没有控制终端,所以任何输出,无论是向标准输出设备stdout还是标准出错设备stderr的输出都需要特殊处理。 守护进程的名称通常以d结尾,比如sshd、xinetd、crond等
僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。
僵尸进程是指进程终止,父进程尚未回收,子进程残留资源PCB存放于内核kernel中变为僵尸zombie进程。父进程有义务将子进程回收,如果子进程死亡后父进程不帮子进程收尸,此时子进程就会变成僵尸。
如何查找僵尸进程的方式:
$ ps -ef | grep defunct
$ ps aux | grep Z
|