fork最简单的例程

/* ************************************************************************
* Filename: exit.c
* Description:
* Version: 1.0
* Created: 2011年05月11日 17时18分52秒
* Revision: none
* Compiler: gcc
* Author: wenhao (wh), hnrain1004@gmail.com
* Company: sunplusapp
* ***********************************************************************
*/


#include
<stdio.h>
#include
<stdlib.h>
#include
<unistd.h>
#include
<pthread.h>
int main(int argc, char *argv[])
{
pid_t fd;

printf(
"hello world1!");//这里要注意,没有'\n'

if((fd = fork()) == -1)
{
perror(
"fork:");
exit(EXIT_FAILURE);
}
else if(fd == 0)
{
printf(
"hello world2!");
exit(
0);
}
else
{
wait(fd);
exit(
0);
}
}

输出结果:

预期hello world1!只输出一次,可是,现在输出了两次.

原因:

printf("hello world1!");如果在后面加一个\n的话,结果就是我们想要的了.

要注意的两个知识点:
1.printf是一个以行缓冲的方式输出内容的, 也就是printf输出时会将要输出的内容存放在缓冲区中,当缓冲区满或遇到\n时才会输出.
2.fork()建立子进程时,子进程会继承父进程的数据段,BSS段,代码段,堆空间,栈空间和文件符,而对于文件描述符关联的内核文件表项,采用的是共享的方式.

了解了这两个知识点,我们就来解释为什么会出现两个hello world1!
因为
printf("hello world1!");没有立刻输出,所以他会存放在缓冲区中,这个缓冲区也被子进程继承了,所以第一个hello world1!是子进程输出的,第二个hello world1!才是父进程输出的.
posted @ 2011-05-11 18:19  hnrainll  阅读(747)  评论(0编辑  收藏  举报