2026/6/20 11:06:03
网站建设
项目流程
柒零叁网温州论坛,网页设计与制作实训报告的综合优化,中国建设手机银行网站,手机上传网站源码文章目录进程创建fork函数多次fork()带来的问题创建“进程链”创建多个子进程进程终止return语句_exit()进程创建
fork函数
#include unistd.h
pid_t fork(void);功能#xff1a;创建子进程返回值#xff1a; 父进程#xff1a;返回子进程的PID#xff08;0fork()带来的问题创建“进程链”创建多个子进程进程终止return语句_exit()进程创建fork函数#includeunistd.hpid_tfork(void);功能创建子进程返回值父进程返回子进程的PID0子进程返回0失败返回-1#includestdio.h#includesys/types.h#includeunistd.hintmain(intargc,constchar*argv[]){pid_tpidfork();if(pid0){perror(fork);return-1;}elseif(pid0){printf(这里是父进程\n);}else{printf(这里是子进程\n);}while(1)sleep(1);return0;}多次fork()带来的问题#includesys/types.h#includeunistd.h#includestdio.hintmain(intargc,constchar*argv[]){pid_tpid;for(inti0;i4;i){pidfork();if(pid0){perror(fork);return-1;}elseif(pid0){printf(child process\n);}else{printf(parent process\n);}}intt100;while(t--)sleep(1);return0;}fork─┬─fork─┬─fork─┬─fork───fork │ │ └─fork │ ├─fork───fork │ └─fork ├─fork─┬─fork───fork │ └─fork ├─fork───fork └─fork创建“进程链”#includesys/types.h#includeunistd.h#includestdio.hintmain(intargc,constchar*argv[]){pid_tpid;for(inti0;i4;i){pidfork();if(pid0){perror(fork);return-1;}elseif(pid0){printf(child process\n);}else{printf(parent process\n);break;}}intt100;while(t--)sleep(1);return0;}$ pstree7658fork02───fork02───fork02───fork02───fork02创建多个子进程#includesys/types.h#includeunistd.h#includestdio.hintmain(intargc,constchar*argv[]){pid_tpid;for(inti0;i4;i){pidfork();if(pid0){perror(fork);return-1;}elseif(pid0){printf(child process\n);break;}else{printf(parent process\n);}}intt100;while(t--)sleep(1);return0;}$ pstree -p16911fork(16911)─┬─fork(16912)├─fork(16913)├─fork(16914)└─fork(16915)进程终止return语句一般的函数执行到return语句之后就会结束并通过return语句返回main函数当中执行return n等同于执行对exit(n)的调用执行未指定返回值的return或是无声无息地执行到main()函数结尾同样会导致main()的调用者执行exit()函数不同的C语言标准对此有不同的规定C89未规定具体的返回值C99标准则要求执行至main函数结尾处的情况应等同于调用exit(0)注意开发当中应避免只写return避免return 没有明确的返回值示例代码#includestdio.h#includestdlib.h#includeunistd.hintmain(void){printf(Hello World!);switch(fork()){case-1:perror(fork error);return-1;case0:exit(0);default:return1;}return1;}exit()主要完成两件事刷新 stdio 流缓冲区终止进程_exit()#includeunistd.hvoid_exit(intstatus);_exit()的status参数定义了进程的终止状态termination statusshell当中可以通过echo $?得到status的值虽然将其定义为int类型但仅有低8位可为父进程所用按照惯例0表示进程“功成身退”非0值则表示进程因异常而退出调用_exit()的程序总会成功终止程序都结束了再检查返回值已经没有意义了示例代码#includestdio.h#includestdlib.h#includeunistd.hintmain(void){printf(Hello World!);switch(fork()){case-1:perror(fork error);exit(-1);case0:_exit(0);default:exit(0);}}进程的两种终止方式异常abnormal终止例如段错误。正常normally终止调用_exit()