Linux下C语言的fork()子进程函数用法及相关问题解析
fork // myfork.c #include <unistd.h> #include <stdio.h> int main(int argc,char **argv) { while (1) { pid_t pid = fork(); if (pid > 0) { // 主进程 sleep(5); } else if (pid == 0) { // 子进程 return 0; } else { fprintf(stderr,"fork errorn"); return 2; } } } 调用fork()函数后,系统会将当前进程的绝大部分资源拷贝一份(其中的copy-on-write技术这里不详述),该函数的返回值有三种情况,分别是: 看两个比较有意思的C语言题目。 #include #include #include int main(){ int i; for(i = 0; i<5; i++){ fork(); printf("%dn",getpid()); fflush(stdout); } } 问题解答: 首先,主进程会循环5次,则我们将5压入到队列中: queue =" 5 "; sum = 0; //sum是总打印次数 主进程会循环5次,打印5行并且产生5个子进程,这5个子进程分别会打印5,4,3,2,1行,则我们将这5个数放入队列,并将第一个5出队列加入到sum中: queue = " 5 4 3 2 1 "; sum = sum + 5; 这样,我们再取队列首元素,即5,他会打印5行,并且生成4个子进程,子进程的分别会打印4,3,2,1行,我们把这4个数放入到队列中,并将第一个5出队列加入到sum中: queue = " 4 3 2 1 4 3 2 1"; sum = sum + 5; 我们继续重复上面的工作,取首元素4,他会打印4行,并且会声称3个子进程,子进程分别打印3,2,1行,重复上面的入队列和出队列操作: queue = " 3 2 1 4 3 2 1 3 2 1 "; sum = sum + 4; 这样,以此重复以上的操作,当遇到元素1的时候,只有出队列而没有入队列的操作,因为只打印1行的子进程不会再循环产生新的子进程。最后,当队列中不再有元素的时候,sum就是总共打印的行数。 第二题:问下面的代码执行后总共产生了多少进程(不包括主进程)?(2009 EMC笔试) #include int main(){ fork(); fork() && fork() || fork(); fork(); } 这个题目跟上一个对比起来就稍微有点难度了,因为你就算画树也有可能算错! 首先,将主进程产生子进程的位置放到队列中: queue = " A B C E "; sum = 0; 我们从队列中取首元素A,我们分析A处产生的进程,发现它会在B,E三处产生子进程,我们把这三个元素插入到队列中,并将sum+1。 queue = " B C E B C E "; sum ++; 然后,我们从队列中取出首元素B,B处产生的子进程稍稍不一样,因为子进程中B所代表的fork()返回值为0,因此C得不到执行,而D会得到执行。因此,B处产生的子进程会执行D,E,将这两个元素送入队列,sum++: queue = " C E B C E D E "; sum ++; 下面,我们取首元素C,分析发现,C处产生的进程会执行D,E,送入队列并且sum++: queue = " E B C E D E D E "; sum ++; 同上一题一样,依次这样执行,遇到E则没有元素入队列,直到最后队列为空,sum就是总共产生的进程个数。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |