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!才是父进程输出的.