oncomputer
测试 fork 的时候,出现以下的一个情况:
#include <stdio.h> #include <unistd.h> int main(int argc, char const *argv[]){ printf("%s,parent:%d,current:%d/n", "start", getppid(), getpid()); pid_t fpid; fpid = fork(); if (fpid < 0){ //error printf("%s:%d/n", "error", fpid); }else if (fpid == 0){ //child printf("%s,parent:%d,current:%d, fpid:%d/n", "child", getppid(), getpid(), fpid); }else{ //host printf("%s,parent:%d,current:%d, fpid:%d/n", "host", getppid(), getpid(), fpid); } return 0; }
按理来说,结果应该是
start,parent:15111,current:19431 host,parent:15111,current:19431, fpid:19432 child,parent:19431,current:19432, fpid:0
但是在 sublime 使用 CTRL + SHIFT + B 执行的时候,结果却是:
start,parent:15111,current:19431 host,parent:15111,current:19431, fpid:19432 start,parent:15111,current:19431 child,parent:19431,current:19432, fpid:0
其中 start 语句“貌似”被执行了两次,这显然是不可能的,问题就发生在 printf 上,以下几个原因集合到一起,就触发了这个看似怪异的结果:
所以,为了保证在各种 stdout 上面的行为一致,最好还是在 fork 之前使用
fflush(stdout);
主动刷新一次缓冲区
同理,在 C++ 里面有相同的问题。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <iostream> using namespace std; int main(){ cout << "Hi , " <<getpid() << endl; fork(); return 0; }
与
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <iostream> using namespace std; int main(){ cout << "Hi , " <<getpid() << "/n"; fork(); return 0; }
区别就是 endl 会强制刷新缓冲区,所以,在输出的时候还是一致使用 endl 比较妥当。
http://stackoverflow.com/questions/21491826/cout-vs-printf-when-doing-fork
转载请注明来自:【xesam】 http://xesam.github.io//computer/2016/06/06/computer-fork%E4%B8%8Eprintf/