免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ccf
打印 上一主题 下一主题

fork的一个例子,好像人家是讲得很详细了,我还是不明白 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2004-07-14 11:43 |只看该作者

fork的一个例子,好像人家是讲得很详细了,我还是不明白

我做如下修改

#include <unistd.h>;
#include <sys/types.h>;

main ()
{
        pid_t pid;
        printf("fork!";    // printf("fork!\n";
        pid=fork();

        if (pid < 0)
                printf("error in fork!";
        else if (pid == 0)
                printf("i am the child process, my process id is %d\n",getpid());
        else
                printf("i am the parent process, my process id is %d\n",getpid());
}[/code]

结果是
[root@localhost c]# ./a.out
fork!i am the child process, my process id is 4286
fork!i am the parent process, my process id is 4285

但我改成printf("fork!\n";后,结果是
[root@localhost c]# ./a.out
fork!
i am the child process, my process id is 4286
i am the parent process, my process id is 4285

为什么只有一个fork!打印出来了?上一个为什么有2个?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
32 [报告]
发表于 2004-07-14 13:48 |只看该作者

fork的一个例子,好像人家是讲得很详细了,我还是不明白

看这个:
http://bbs.chinaunix.net/forum/viewtopic.php?t=244249&highlight=蓝色键盘

论坛徽章:
0
33 [报告]
发表于 2004-07-14 16:03 |只看该作者

fork的一个例子,好像人家是讲得很详细了,我还是不明白

搭车问一个弱问题:

if(fork()==0)
    system("cat test.c";

这样是不是会产生2个进程?分别是子进程和cat?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
34 [报告]
发表于 2004-07-14 16:32 |只看该作者

fork的一个例子,好像人家是讲得很详细了,我还是不明白

man system

论坛徽章:
0
35 [报告]
发表于 2004-07-14 17:10 |只看该作者

fork的一个例子,好像人家是讲得很详细了,我还是不明白

man了下,感觉还是做为个进程,另发现他的说明里推荐用exec,说什么会产生参数影响,不甚明白,盼楼上的能继续解释一下,谢谢

论坛徽章:
0
36 [报告]
发表于 2004-07-14 20:41 |只看该作者

fork的一个例子,好像人家是讲得很详细了,我还是不明白

原帖由 "ccf"]alhost c 发表:
# ./a.out
i am the child process, my process id is 4286
i am the parent process, my process id is 4285


我就想不到为什么两行都打印出来了,在我想来,不管pid是多少,都应该只有一行才对
fork返回值是两个,一个返回给父进程(子进程的ID)一个返回给子进程(0)

论坛徽章:
1
15-16赛季CBA联赛之四川
日期:2016-02-15 17:12:32
37 [报告]
发表于 2004-07-14 21:30 |只看该作者

fork的一个例子,好像人家是讲得很详细了,我还是不明白

main()
{
int a;
int pid;
printf("AAAAAAAA";//print 一次;
pid=fork();//重这里开始分为两个
if(pid==0){//在这里定义的变量父进程是不会有的:int b;
printf("ok";}
else if(pid>;0){
printf("is ok\n";//if you want print b;error!but you can print a;
}
printf("BBBBBBB";//父子进程都会打印;
}

不知道我的回答是否正确!

论坛徽章:
0
38 [报告]
发表于 2004-07-14 22:10 |只看该作者

fork的一个例子,好像人家是讲得很详细了,我还是不明白

我也来一下:
wujiajia 的理解有些错误,
printf("AAAAAAAA";//print 一次;   这里会print 2次
如果你将 printf("AAAAAA" 换成 printf("AAAAAA\n"   那么就是只打印一次了.
主要的区别是因为有了一个 \n  回车符号
这就跟Printf的缓冲机制有关了,printf某些内容时,操作系统仅仅是把该内容放到了stdout的缓冲队列里了,并没有实际的写到屏幕上
但是,只要看到有 \n 则会立即刷新stdout,因此就马上能够打印了.
运行了printf("AAAAAA" 后, AAAAAA 仅仅被放到了缓冲里,再运行到fork时,缓冲里面的 AAAAAA 被子进程继承了
因此在子进程度stdout缓冲里面就也有了 AAAAAA.
所以,你最终看到的会是 AAAAAA 被printf了2次!!!!
而运行 printf("AAAAAA\n"后, AAAAAA 被立即打印到了屏幕上,之后fork到的子进程里的stdout缓冲里不会有 AAAAAA 内容
因此你看到的结果会是 AAAAAA 被printf了1次!!!!

论坛徽章:
0
39 [报告]
发表于 2004-07-17 10:19 |只看该作者

fork的一个例子,好像人家是讲得很详细了,我还是不明白

真是佩服各位,很受用

论坛徽章:
0
40 [报告]
发表于 2004-07-17 21:51 |只看该作者

fork的一个例子,好像人家是讲得很详细了,我还是不明白

[quote]原帖由 "ohwww"]真是佩服各位,很受用[/quote 发表:

是呀
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP