一个关于linux fork()的笔试题

林初茵 2013-03-05 02:13:08
14 If one compiled and ran the following C Program in linux. Which of the descriptions below is(are) correct, assuming that the fork() syscall will not fail?
#include <stdio.h>
#include <unistd.h>

int main(void)
{
int i = 1;
if(!fork()) i++;
printf("%d\n", i);

if(!fork()) i++;
printf("%d\n", i);
return 0;
}
A. The output will include number "1" exactly two times;
B. The output will include number "2" exactly two times;
C. Number "3" will always be last outputted;
D. Number "1" will always be ahead of number "3" in output;
E. It is possible that no number "3" in output, because "i++" is not an atomic operation.
...全文
327 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
兆帅 2013-03-07
  • 打赏
  • 举报
回复
版主很强哦!学习了
mymtom 2013-03-06
  • 打赏
  • 举报
回复
fork后父进程和子进程的执行顺序是不确定的; 如果父进程先执行完,子进程的ppid就是1啦。 所以无论是fork1.c还是fork2.c都是有可能打印ppid=1的,楼主多执行几次,也许就会出现了。
林初茵 2013-03-06
  • 打赏
  • 举报
回复
我是楼主 我有个追加问题 问一下 期待各位大牛解答: [root@pcm ~]# cat fork1.c #include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(void) { int i; for(i=0; i<2; i++){ fork(); printf("ppid=%d, pid=%d, i=%d \n", getppid(), getpid(), i); } sleep(10); return 0; } 这个的答案 是 [root@pcm ~]# ./fork1 ppid=2412, pid=12161, i=0 ppid=2412, pid=12161, i=1 ppid=12161, pid=12163, i=1 ppid=12161, pid=12162, i=0 ppid=12161, pid=12162, i=1 ppid=12162, pid=12164, i=1 ---------------------------------------------------------- 但是 [root@pcm ~]# cat fork2.c #include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(void) { int i; for(i=0; i<2; i++){ pid_t fpid = fork(); if(fpid==0) printf("ppid=%d, pid=%d, i=%d \n", getppid(), getpid(), i); else printf("ppid=%d, pid=%d, i=%d \n", getppid(), getpid(), i); } //sleep(10); return 0; } 答案是 [root@pcm ~]# ./fork2 ppid=2412, pid=12263, i=0 ppid=2412, pid=12263, i=1 ppid=1, pid=12265, i=1 ppid=1, pid=12264, i=0 ppid=1, pid=12264, i=1 ppid=1, pid=12266, i=1 -------------------------------------------------- 我的问题是 为什么后者方程就加一个if语句 然后 ppid就为1了 父进程什么时候被干掉的呢? 什么时候做的操作呢? 很奇怪啊
palm008 2013-03-06
  • 打赏
  • 举报
回复
我同意版主的分析
palm008 2013-03-06
  • 打赏
  • 举报
回复
我同意楼主的分析
nice_cxf 2013-03-06
  • 打赏
  • 举报
回复
3楼正解,只有A正确,8楼解释也很清晰
mujiok2003 2013-03-06
  • 打赏
  • 举报
回复
引用 8 楼 mymtom 的回复:
引用 5 楼 wangyaqi123 的回复:引用 4 楼 mymtom 的回复:+表示fork系统调用,考虑fork两个进程的执行顺序是不确定的,可以排除C,D; B显然不对,2输出3次; E不对3输出1次;只有A正确,1输出两次。 肿么个具体过程呀? Plain Text code?12345A-+---1-+---1 | |-C-2 | |-B……
不错,很透彻,所以答案是A,D
mymtom 2013-03-06
  • 打赏
  • 举报
回复
引用 5 楼 wangyaqi123 的回复:
引用 4 楼 mymtom 的回复:+表示fork系统调用,考虑fork两个进程的执行顺序是不确定的,可以排除C,D; B显然不对,2输出3次; E不对3输出1次;只有A正确,1输出两次。 肿么个具体过程呀?

A-+---1-+---1
  |     |-C-2
  |
  |-B-2-+---2
        |-D-3
上面的图用来说明进程关系 (注意:由于if(!fork()) i++;所以只有子进程才会执行i++) 0. 假设开始是进程为A, 1. 第一次fork 1.1 A fork 后产生子进程B 2. 第一个printf("%d\n", i); 2.1 进程A输出1 2.2 进程B输出2 3. 第二次fork 3.1 A fork 产生子进程C 3.2 B fork 产生子进程D 4. 第二个printf("%d\n", i); 4.1 进程A输出1 4.2 进程B输出2 4.3 进程C输出2 4.4 进程D输出3
mymtom 2013-03-06
  • 打赏
  • 举报
回复
引用 17 楼 jinder22 的回复:
版主你好 确实是这个原因 BUT 这个sleep影响很大么 他为什么会影响父进程呢?
sleep(10), 等待十秒啊,这几乎可以100%保证在getppid执行的时候,4个进程都还没有退出。 所以ppid就不易等于1啊。
林初茵 2013-03-06
  • 打赏
  • 举报
回复
版主你好 确实是这个原因 BUT 这个sleep影响很大么 他为什么会影响父进程呢?
mymtom 2013-03-06
  • 打赏
  • 举报
回复
仔细看了一下,原因是fork1.c里有sleep(10), fork2.c里的sleep(10)是被注释掉的,
引用 15 楼 jinder22 的回复:
版主你好 fork1我怎么都不会出现1 fork2我每次必现1
林初茵 2013-03-06
  • 打赏
  • 举报
回复
版主你好 fork1我怎么都不会出现1 fork2我每次必现1
ljhhh0123 2013-03-05
  • 打赏
  • 举报
回复
这是我的ubuntu12.4 32b的输出,后面加上了进程id 1---pid==4871 2---pid==4872 1---pid==4871 2---pid==4873 2---pid==4872
无间虚者 2013-03-05
  • 打赏
  • 举报
回复
引用 5 楼 wangyaqi123 的回复:
引用 4 楼 mymtom 的回复:+表示fork系统调用,考虑fork两个进程的执行顺序是不确定的,可以排除C,D; B显然不对,2输出3次; E不对3输出1次;只有A正确,1输出两次。 关于输出顺序,可以确定的是3前面一定有2. Plain Text code?12345A-+---1-+---1 | |-C-2 | |-B-2-+---2 ……
当我没说
无间虚者 2013-03-05
  • 打赏
  • 举报
回复
引用 4 楼 mymtom 的回复:
+表示fork系统调用,考虑fork两个进程的执行顺序是不确定的,可以排除C,D; B显然不对,2输出3次; E不对3输出1次;只有A正确,1输出两次。 关于输出顺序,可以确定的是3前面一定有2. Plain Text code?12345A-+---1-+---1 | |-C-2 | |-B-2-+---2 |-D-3
肿么个具体过程呀?
mymtom 2013-03-05
  • 打赏
  • 举报
回复
+表示fork系统调用,考虑fork两个进程的执行顺序是不确定的,可以排除C,D; B显然不对,2输出3次; E不对3输出1次;只有A正确,1输出两次。 关于输出顺序,可以确定的是3前面一定有2.

A-+---1-+---1
  |     |-C-2
  |
  |-B-2-+---2
        |-D-3
mymtom 2013-03-05
  • 打赏
  • 举报
回复
只有A是对的吧。
mujiok2003 2013-03-05
  • 打赏
  • 举报
回复
A,B!!!

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧