初始态,就绪态,运行态,挂起态与终止态
Fork函数
● fork函数代码片段实例
...... pid_t pid = fork(); if(pid<0) { perror("fork error"); return -1; } else if(pid>0) { printf("father: [%d], pid==[%d], fpid==[%d]\n", pid, getpid(),getppid()); //sleep(1); } else if(pid==0) { printf("child: pid==[%d], fpid==[%d]\n", getpid(), getppid()); } ......
如果想在一个进程内部执行系统命令或者是应用程序, 可以使用execl和execlp函数拉起可执行程序或者命令.
....... else if(pid==0) //子进程 { printf("child: pid==[%d], fpid==[%d]\n", getpid(), getppid()); execl("/bin/ls", "ls", "-l", NULL); execl("./test", "test", "hello", "world", "ni", "hao", NULL); execlp("ls", "ls", "-l", NULL); ......
当一个进程退出之后,进程能够回收自己的用户区的资源,但是不能回收内核空间的PCB资源,必须由它的父进程调用wait或者waitpid函数完成对子进程的回收,避免造成系统资源的浪费。
孤儿进程是指父进程已死而子进程还活着,此时子进程就是孤儿进程。
孤儿进程会被init进程领养。
若子进程死了,父进程还活着, 并且父进程没有调用wait或waitpid函数回收子进程,此时子进程就成了僵尸进程。
由于僵尸进程已死,不能用kill命令杀死子进程,回收子进程的方法如下:
杀死父进程->僵尸进程被init进程领养->由init回收
#include <sys/wait.h> pid_t wait(int * statloc); pid_t waitpid(pid_t pid,int *statloc,int options);
调用wait或waitpid的进程发生的情况如下: