前言 总结送福利
使用系统调用fork()创建三个子进程;
各个子进程显示和输出一些提示信息和自己的进程标识符;
父进程显示自己的进程ID和一些提示信息,然后调用waitpid()等待多个子进程结束,并在子进程结束后显示输出提示信息表示程序结束。
代码能说明问题
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdarg.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <time.h>
int tprintf(const char *fmt,…);
int main(void)
{
printf(“I’m your father,PID is %d.\n”,getpid());
pid_t pid = fork();
if(pid == 0){
printf(“I’m a first son.PID is %d.\n”,getpid());
exit(1);//若此处没有exit(1), 进程也会执行 pid_t pid2 = fork()语句,会出现孙进程
printf(“You should never see this.\n”);
}
pid_t pid2 = fork();
if(pid2 == 0){
printf(“I’m a second son.PID is %d.\n”,getpid());
exit(1);
printf(“You should never see this.\n”);
}
pid_t pid3 = fork();
if(pid3 ==0){
printf(“I’m a third son.PID is %d.\n”,getpid());
exit(1);
printf(“You should never see this.\n”);
}
else if(pid != -1){
tprintf(“Parent forked child process–%d.\n”,pid);
tprintf(“Parent is waiting for child to exit.\n”);
waitpid(pid,NULL,0);
waitpid(pid2,NULL,0);
waitpid(pid3,NULL,0);
tprintf(“Child Process had exited.\n”);
tprintf(“Parent had exited.\n”);
}
elsetprintf(“Everything was done without error.\n”);
return 0;
接下来问题就来了
fork的时候发生什么?
①执行到这一句的时候,一个进程被创建了,这个进程与父进程一样,拥有一套与父进程相同的变量,相同的一套代码,这里可以粗浅的理解为子进程又复制了一份main函数。这里返回一个子进程的进程号,大于0。(第一次fork)
②子进程怎么执行:
子进程从fork()的位置开始执行,也就是说前面的代码不走,但是拥有之前的变量以及变量的值,与父进程的值一样,这次fork(),返回值是0,所以在子进程里面直接执行了pid==0这一个分支,父进程里面并不执行这个分支的语句。这就为我们在写mian函数的时候怎么写子进程的程序提供了一个方法来隔离代码。
明白了这个原理之后我们再来看一段代码
*
* 设置输出格式
*/
int tprintf(const char* fmt,…)
{
va_list args;
struct tm *tstruct;
time_t tsec;
tsec = time(NULL);
tstruct = localtime(&tsec);
printf(“%02d:%02d:%02d:%5d|”,tstruct->tm_hour,tstruct->tm_min,tstruct->tm_sec,getpid());
va_start(args,fmt);
return vprintf(fmt,args);
运行结果
这里每一次输出表示一个进程的创建,可以看到一共有8个进程被创建,有兴趣的话可以验证一下连续四次fork可以出16个进程,但是不建议再多了,电脑会卡死,不要问我怎么知道的!
猜想是出2的n次方个进程。如果上面的第一段代码理解了的话,我们按照子进程从父进程fork的位置开始执行就会理解为什么会有八个进程。
这里附上思维导图助于理解
那么我们想创建不是2的n次方个进程应该怎么做呢?这里还是以三个为例
#include <stdio.h>
#include <stdlib.h>
#include <sys/unistd.h>
int main(int argc, char *argv[]) {
int i,j,status;
int pid[3];
for(i=0; i<3;i++){
if((pid[i]=fork()) >0){
printf(“This is child process pid=%d\n”,pid[i]);
} else{
printf(“This is father process pid=%d\n”,pid[i]);
exit( EXIT_SUCCESS);
}
}
return EXIT_SUCCESS;
}
总结
不是最准确的,可以与三次fork进行对比。
关注+后台私信;资料;两个字可以免费领取 资料内容包括:C/C++,Linux,golang,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,嵌入式 等。。。
今天的文章linux下连续三次fork()——深度理解进程创建函数分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/8168.html