Linux系统fork()函数简析

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_44687987/article/details/88392790

Linux系统fork()函数简析

fork()函数的作用就是创建一个一模一样的进程,当这个程序执行到fork()函数时,通过系统调用会创建一个与主进程一样的子进程。意思就是两个进程可以做一样的事,做两遍。

#include <cstdio>
#include <unistd.h>
#include <stdio.h>

int main()
{
	pid_t  mypid;							//定义一个变量,用来保存fork()函数执行后的返回值
	int Number = 0;
	mypid = fork();							//创建子进程,复制给mypid
	if (mypid<0)								//用mypid的值,判断是否为主进程
	{
		printf("error in fork\n");
	}
	else if(fpid==0)
	{
		printf("i am A  %d\n", getpid());
		Number++;
	}
	else
	{
		printf("i am B  %d\n", getpid());
		Number++;
	}
	sleep(1000);
	return 0;
}

利用fork()函数创建进程后返回值赋予mypid,如果
1,在父进程中,fork返回新创建子进程的进程ID;
2,在子进程中,fork返回0;
3,如果出现错误,fork返回一个负值;

所以,判断mypid的值就能知道是否是主进程。getpid()函数的作用是获得当前进程的ID。
(注:printf()函数字符串后面要加\n,换行符,否则可能出现不打印到控制台窗口的情况。具体原因暂不谈)

运行结果为:

在这里插入图片描述
后面是进程ID,不同电脑不一样。
我们看到一个if判断执行了两次,而且是不一样的结果。这就是因为利用fork()函数创建主子进程的原因。

那如果在for循环里面用fork()会怎么样。

#include <cstdio>
#include <unistd.h>
#include <stdio.h>

int main()
{
	pid_t mypid;
	int checknumber = 0;

	for (int i = 0; i < 2; i++)
	{
		mypid = fork();
		if (mypid == 0)
		{
			printf("It's child.%d\n", checknumber);
			checknumber++;
		}
		else
		{
			printf("It's father.%d\n", checknumber);
			checknumber++;
		}
	}
	sleep(1);
	return 0;
}

运行结果为:
在这里插入图片描述
我们看到有六次输出,主子进程各三个,其实这也可以看成链表的形式,我们可以用树来表示就清楚很多:
在这里插入图片描述
(图片摘自https://blog.csdn.net/jason314/article/details/5640969)
且当主进程结束后,就是for循环结束后,程序执行到return 0,程序就结束了,所一子进程无法进入第三次循环,没有父进程的子进程是不允许操作的。

如果想更深入了解,请移步https://blog.csdn.net/jason314/article/details/5640969
谢谢!

展开阅读全文

fork()函数入门级问题:fork()与进程数

09-05

这样一段代码:rn最后还剩2个进程?为什么呢?rn我的意见是 初始父进程 在第一次fork()后终止;第一子进程在第二次fork()后终止,然后就只剩下第二子进程了???rn[code=C/C++]rnif ( (pid=fork())<0 )rn printf("error fork()\n");rn exit(1) ;rn rnrn else if (pid!=0) rn exit(0);rn rnrn// ...............................................................some other ,but have no fork() rnrn if ( (pid=fork()<0) )rn fputs("error fork()\n",stdout);rn exit(1) ;rn rn else if (pid!=0) rn exit(0);rn rn[/code]rnrn这是完整的源码:rn[code=C/C++]rnvoid daemonize(const char *cmd)rnrn int i,fd0,fd1,fd2;rn pid_t pid;rn struct rlimit rl;rn struct sigaction sa;rnrn umask(0);rnrn if ( getrlimit(RLIMIT_NOFILE,&rl)<0 )rn printf("%s can't get file limit.\n",cmd);rn exit(1) ;rn rnrn if ( (pid=fork())<0 )rn printf("error fork()\n");rn exit(1) ;rn rnrn else if (pid!=0) rn exit(0);rn rnrn setsid();//creates a session and sets the process group ID.rnrn sa.sa_handler = SIG_IGN;rn sigemptyset(&sa.sa_mask);rn sa.sa_flags=0;rn if (sigaction(SIGHUP,&sa,NULL)<0)rn printf("error sigaction()");rn exit(1) ;rn rnrn if ( (pid=fork()<0) )rn fputs("error fork()\n",stdout);rn exit(1) ;rn rn else if (pid!=0) rn exit(0);rn rn/*rn if ( chdir("/tmp")<0 )rn FILE *fp=fopen("err","w");rn fprintf(fp,"%d",errno);rn fprintf(fp,"woj");rnrn printf("error chdir()\n");rn exit(1) ;rn rn*/rnrn if (rl.rlim_max == RLIM_INFINITY)rn rl.rlim_max = 1024;rn rn for(i=0;i 论坛

fork()函数问题

03-30

关于fork()函数创建子进程 ,是复制fork()语句后面的全部父进程吗?rnrn书上有段fork()代码,执行起来有些不明白的地方!求高手讲解下,代码如下:rnrn#include rn 2 #include rn 3 #include rn 4 #include rn 5 #include rn 6 rn 7 int main (void )rn 8 rn 9 pid_t child1,child2,child;rn 10 rn 11 child1 = fork();rn 12 child2 = fork();rn 13 rn 14 if(child1 == -1)rn 15 rn 16 printf("child1 fork error\n");rn 17 exit(1);rn 18 rn 19 else if(child1 == 0)rn 20 rn 21 printf("in child1 : execute 'ls -l'\n");rn 22 if(execlp("ls","ls","-l",NULL)<0)rn 23 rn 24 printf("child1 execlp error\n");rn 25 rn 26 rn 27 rn 28 if(child2 == -1)rn 29 rn 30 printf("child2 fork error\n");rn 31 exit(1);rn 32 rn 33 else if(child2 == 0)rn 34 rn 35 printf("in child2 : sleep for 5 seconds and then exit\n");rn 36 sleep(5);rn 37 exit(0);rn 38 rn39 elsern 40 rn 41 printf("in father process\n");rn 42 child=waitpid(child1,NULL,0);rn 43 if(child == child1)rn 44 rn 45 printf("get child1 exit code\n");rn 46 rn 47 elsern 48 rn 49 printf("error \n");rn 50 rn 51 dorn 52 rn 53 child = waitpid(child2,NULL,WNOHANG);rn 54 if(child == 0)rn 55 rn 56 printf("the child2 process has not exited\n");rn 57 sleep(1);rn 58 rn 59 rn 60 while(child == 0);rn 61 rn 62 if(child == child2)rn 63 rn 64 printf("get child2 exit code\n");rn 65 rn 66 elsern 67 rn 68 printf("error \n");rn 69 rn 70 rn 71 exit(0);rn 72 rnrn想问一下,为什么child1 和 child1再创建的子进程 不去执行对child2的判断语句!child1 也对child2进行过创建 也有child2的值阿 ,却在执行完child1 的判断直接结束掉了?是fork()函数的确定的代码段范围直到child1判断结束的地方?rnrn我预想的输出结果应该是 2次 ls ,两次 in father ,两次 sleep rn但结果是 两次 ls, 一次 in father 和 一次 sleep !rn 论坛

没有更多推荐了,返回首页