我正在使用fork()编写一个简单的C程序来创建进程的二叉树。我能够获得我需要的所有输出(进程的pid,父进程和它的两个子进程)。不幸的是,每个分支进程都想打印出列标题。我如何确保头文件的printf只执行一次?fork()会为每个进程打印列标题
# include <stdio.h>
# include <stdlib.h>
# include <sys/types.h>
# include <unistd.h>
# include <sys/wait.h>
int main(int argc, char *argv[]){
//Declarations
int i;
int child_1_pid, child_2_pid;
int num_levels = atoi(argv[1]);
//Output banners
//execlp("/bin/echo", "echo", "Level\tProcs\tParent\tChild1\tChild2\nNo.\tID\tID\tID\tID", (char *) NULL);
//if(getpid() > 0)
printf("Level\tProcs\tParent\tChild1\tChild2\nNo.\tID\tID\tID\tID");
//Creates binary tree of processes
for(i = 0; i < num_levels; i++){
if((child_1_pid = fork()) && (child_2_pid = fork())){
printf("\n%d\t%d\t%d\t%d\t%d", i, getpid(), getppid(), child_1_pid, child_2_pid);
sleep(2); //prevents parent from terminating before child can get ppid (parent's pid)
break; //why?
}
}//end for
printf("\n"); //EXPLAIN ME!!
exit(0);
}//end main
有一些更多的代码(错误真的检查),但我真正的问题是,在输出横幅部分中的printf执行多次,给人输出这样的(但正确对齐):
Level Procs Parent Child1 Child2 No. ID ID ID ID No. ID ID ID ID No. ID ID ID ID No. ID ID ID ID No. ID ID ID ID No. ID ID ID ID No. ID ID ID ID 0 30796 24743 30797 30798 1 30797 30796 30799 30800 1 30798 30796 30801 30802
我已经尝试了一些想法(包括那些在横幅部分注释掉的),但似乎没有任何工作,大多数“修复”使问题变得更糟!
我想我可以解释你看到的奇怪的印刷。你的'sleep(2)`和`printf(“\ n”)`可以是`fflush(0)`。 – nmichaels 2011-02-22 19:51:05
在`printf`修复了什么之后添加`fflush(stdout);`?这可能是stdio缓冲区被复制到子进程中,并且只能在那里打印。 – 2011-02-22 19:51:39
是的!添加fflush可以解决多重打印问题。我还删除了底部的\ n打印以避免多余的空白行。另外,如下所述,我必须在流程打印行之后放置一个fflush(在for循环内)。 – 2011-02-22 20:15:00