当前位置: 技术问答>linux和unix
fork()问题
来源: 互联网 发布时间:2017-05-03
本文导语: int main(void) { printf("1 n"); fork(); printf("2 n"); fork(); printf("3 n"); exit(0); } 运行的结果是这样的: 1 2 3 2 3 3 3 ; 然后把'n'去掉,变成这样的代码: int main(void) { printf("1 "); fork(); printf("2 "); fork(); printf("3 "); exit(0); } 后,...
int main(void)
{
printf("1 n");
fork();
printf("2 n");
fork();
printf("3 n");
exit(0);
}
运行的结果是这样的:
1
2
3
2
3
3
3 ;
然后把'n'去掉,变成这样的代码:
int main(void)
{
printf("1 ");
fork();
printf("2 ");
fork();
printf("3 ");
exit(0);
}
后,结果变成这样:
1 2 3 1 2 3 1 2 3 1 2 3
求大神解释!
|
占沙发了。
是因为缓冲区的问题。printf linux io自带缓冲区的。
在你printf后数据其实还在缓冲区。当你fork子进程的时候
子进程连缓冲区中的数据一起copy了过去。也就是说
如果你在父进程中printf 1,然后fork子进程,子进程创建的时候
io缓冲区中已经有了1这个数据,这样当你printf2的时候子进程的缓冲区
其实是1,2两个数据。
是因为缓冲区的问题。printf linux io自带缓冲区的。
在你printf后数据其实还在缓冲区。当你fork子进程的时候
子进程连缓冲区中的数据一起copy了过去。也就是说
如果你在父进程中printf 1,然后fork子进程,子进程创建的时候
io缓冲区中已经有了1这个数据,这样当你printf2的时候子进程的缓冲区
其实是1,2两个数据。
|
这个很好理解
1---->2----->3
| |-->3
|-->2------3
|-->3
n是刷新缓冲,没有n刷新,1在缓冲力也会被复制,刷新了,缓冲是空的,复制不到东西。
1---->2----->3
| |-->3
|-->2------3
|-->3
n是刷新缓冲,没有n刷新,1在缓冲力也会被复制,刷新了,缓冲是空的,复制不到东西。
|
沙发兄弟已经说的很对了,结贴吧。