当前位置: 技术问答>linux和unix
这难道是linux的bug吗??求高手指点!
来源: 互联网 发布时间:2017-02-18
本文导语: 我装的是fedora 16,今天在写c程序时,意外发现 fork()函数出现了很奇怪的现象。 下面两段代码执行的结果竟然不一样 代码一: #include int main() { int pid; printf(“aaaaaa”); printf(“bbbbbb”)...
我装的是fedora 16,今天在写c程序时,意外发现 fork()函数出现了很奇怪的现象。
下面两段代码执行的结果竟然不一样
代码一:
#include
int main()
{
int pid;
printf(“aaaaaa”);
printf(“bbbbbb”);
pid=fork();
return 0;
}
执行结果:
aaaaaabbbbbbaaaaaabbbbbb
代码二:
#include
int main()
{
int pid;
printf(“aaaaaan”);
printf(“bbbbbbn”);
pid=fork();
return 0;
}
执行结果:
aaaaaa
bbbbbb
这两个程序的代码知识相差了一个换行啊,怎么会结果不一样呢?其他人可以试试你们的情况是不是也是这样。
还请高手指点啊!
下面两段代码执行的结果竟然不一样
代码一:
#include
int main()
{
int pid;
printf(“aaaaaa”);
printf(“bbbbbb”);
pid=fork();
return 0;
}
执行结果:
aaaaaabbbbbbaaaaaabbbbbb
代码二:
#include
int main()
{
int pid;
printf(“aaaaaan”);
printf(“bbbbbbn”);
pid=fork();
return 0;
}
执行结果:
aaaaaa
bbbbbb
这两个程序的代码知识相差了一个换行啊,怎么会结果不一样呢?其他人可以试试你们的情况是不是也是这样。
还请高手指点啊!
|
这难道是linux的bug吗~~~~~~~~~~~~~这么霸气的标题~~~~~我以为是啥呢
第一个中:先后printf了两句到缓存里,没刷新缓存又创建了子进程,子进程复制了父进程的资源,所以子进程中也有aaaabbbb,进程结束时清空缓存,所以父进程输出一遍,子进程输出了一遍(程序结束时输出的)
第二个中:printf遇到"n"刷新缓存,输出了aaaa bbbb,缓存中没有内容了,fork时子进程缓存也是空的。。所以只输出了一遍(是在fork前输出的)
第一个中:先后printf了两句到缓存里,没刷新缓存又创建了子进程,子进程复制了父进程的资源,所以子进程中也有aaaabbbb,进程结束时清空缓存,所以父进程输出一遍,子进程输出了一遍(程序结束时输出的)
第二个中:printf遇到"n"刷新缓存,输出了aaaa bbbb,缓存中没有内容了,fork时子进程缓存也是空的。。所以只输出了一遍(是在fork前输出的)
|
再补充一点 子进程是从fork后的语句开始运行的 所以你的理解有误 fork出来的子进程不是从一开始又运行一边 而是从fork后开始执行的
你可以利用fork的返回值来做进一步实验