fork

[本篇全文] [本篇作者: OP07] [本篇人气: 19] 0
发信人: OP07 (【EE07】打雷『齊魯』), 信区: LinuxUnix
标  题: [合集]问一下fork()多进程
发信站: 南京大学小百合站 (Tue Aug 14 11:17:01 2012)

asic (阿塞克)Mon Jul 16 12:48:46 2012)
提到:

int main() {
printf("hello ");
fork();
printf("world\n");
}

执行结果是打印了两行 hello world
和我之前所理解的不一样,我理解的是父进程执行到fork()函数才生成子进程,这样的话
应该是打印一个hello和两个world 
求版内大神科普下,拜谢!

OP07 (【EE07】打雷『齊魯』)Mon Jul 16 13:44:27 2012)
提到:

这个问题出在printf
他是有数据缓冲区的,不加\n数据不刷新
fork()创建子进程时,
子进程复制了父进程的数据段和堆栈段
包括printf的数据缓冲区也被复制
再执行后面的printf打印刷新当然
就是两遍hello world了
要是改成printf("hello \n");
就一遍hello
两遍world了


asic (阿塞克)Mon Jul 16 14:40:51 2012)
提到:


豁然开朗,多谢大神!

asic (阿塞克)Mon Jul 16 14:53:33 2012)
提到:

试了一下,果然是这样的
另外把程序改成下面这样,打印的两句果真都是父进程的PID
int main() {
printf("hello:pid=%d",getpid());
fork();
printf("world\n");
}



chuan92 (数星河)Mon Jul 16 15:39:58 2012)
提到:

学习了,以前只知道fflush(stdout),原来\n也可以。

oinil (Raison d'être)Mon Jul 16 18:03:59 2012)
提到:

顶!
学习了

bsidb (淡蓝天际的星光)Mon Jul 16 19:29:56 2012)
提到:

学习之~~原来理论和实际还是有距离的~


NotYou (【姑蘇】陆草纯)Mon Jul 16 20:26:19 2012)
提到:

就是这样,以前类似问题向jyy大神请教过,


bankq (Ripa)Mon Jul 16 22:32:29 2012)
提到:

原来\n会刷新,学习了!


mutalisk (mutalisk)Wed Jul 18 20:15:15 2012)
提到:

默认终端是行缓存的  文件是全缓存的
换行符会刷新终端,但是文件不会



csxzy (HelloWorld)Fri Jul 20 10:08:03 2012)
提到:

啥叫全缓存?等程序结束?
-
发自我的步步高学习机

EEDC (屌丝大元帅)Sun Jul 22 07:29:03 2012)
提到:

顶大神
学习了
牛的一腿

mutalisk (mutalisk)Sun Jul 22 09:36:50 2012)
提到:

发信人: csxzy (HelloWorld), 信区: LinuxUnix
标  题: Re: 问一下fork()多进程
发信站: 南京大学小百合站 (Fri Jul 20 10:08:03 2012)

啥叫全缓存?等程序结束?

请阅读APUE第5章第4节


posted @ 2012-08-24 09:02  goooooooooo  阅读(347)  评论(0编辑  收藏  举报