linux下连续三次fork()——深度理解进程创建函数

linux下连续三次fork()——深度理解进程创建函数1执行到这一句的时候,一个进程被创建了,这个进程与父进程一样,拥有一套与父进程相同的变量,相同的一套代码,这里可以粗浅的理解为子进程又复制了一份

前言 总结送福利

使用系统调用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的位置开始执行就会理解为什么会有八个进程。

这里附上思维导图助于理解

linux下连续三次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

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注