fork
include <unistd.h>
函数签名:pid_t fork(void);
子进程中返回0,父进程中返回子进程ID,出错返回-1
waitpid
include <sys/wait.h>
函数签名:
pid_t waitpid(pid_t pid,int* stat_loc,int options);
-
参数
-
id:
pid<-1 等待进程组识别码为 pid 绝对值的任何子进程。
pid=-1 等待任何子进程,相当于 wait()。
pid=0 等待进程组识别码与进程相同的任何子进程。
pid>0 等待任何子进程识别码为 pid 的子进程。
stat_loc: 文档没介绍,一般用int*的零值 NULL
options: 提供一些额外选项来控制waitpid
-
-
功能
waitpid会暂时停止目前进程的执行,直到有信号来或子进程结束时;如果在调用waitpid()时子进程已经结束,则waitpid()会立即返回子进程结束状态值。子进程的结束状态值由参数status返回。
getpid
include <unistd.h>
函数签名:
pid_t getpid(void);
pid_t getppid(void);
//用于获取父(parent)进程的pid
exit
include <stdlib.h>
函数签名:
void eixt(int status);
-
参数
status: 填0, EXIT_SUCCESS, EXIT_FAILURE
示例1 创建一个这样的进程
image.png
for(int i=0;i<10;i++) {
pid = fork();
if(pid==0) {
return 0;
}else {
continue;
}
}
创建一个如下的
image.png
for(int i=1;i<11;i++) {
if(pid==0) {
pid = fork();
if(i==10&&waitpid(pid,NULL,0)) {
//在创建最后一层子进程时,获取整个父子进程树结构
sprintf(cmd, "pstree %d > temp", top_pid);
system(cmd);
}
}else {
waitpid(pid,NULL,0);
}
}
image.png
for(int i=0;i<level;i++){
pid_t pid = fork();
if(pid > 0)
{
pid = fork();
if(pid > 0) break;
}
}
if(top_pid==getpid()) {
CheckProcessTree(top_pid);
sleep(5);
}else{
sleep(5);
}
}