C语言fork函数

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);
 }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容