Я пишу простую программу на C, используя fork() для создания двоичного дерева процессов. Я могу получить весь вывод, который мне нужен (pid процесса, его родителя и двух его дочерних элементов). К сожалению, каждый разветвленный процесс хочет распечатать заголовки столбцов. Как мне убедиться, что printf для заголовков выполняется только один раз?
# 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, childLevel 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
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()) && (childLevel 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
pid = fork())){
printf("\n%d\t%d\t%d\t%d\t%d", i, getpid(), getppid(), child_1_pid, childLevel 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
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)
. - person nmichaels   schedule 22.02.2011fflush(stdout);
послеprintf
? Возможно, буферы stdio копируются в дочерние процессы и печатаются только там. - person Jeremiah Willcock   schedule 22.02.2011