私はプロセスのバイナリツリーを作成するためにfork()を使って簡単なCプログラムを書いています。私は必要なすべての出力を得ることができます(プロセスの親、親、およびその2人の子供)。残念なことに、各フォークされたプロセスは、列見出しを印刷する必要があります。ヘッダーのprintfが1回だけ実行されることを確認するにはどうすればよいですか?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
'printf'の修正後に' fflush(stdout); 'を追加しますか? stdioバッファが子プロセスにコピーされ、そこにのみ印刷されることがあります。 –
はい! fflushを追加すると、複数の印刷問題を解決できます。余分な空白行を避けるため、\ nプリントを一番下に削除しました。また、以下に述べるように、プロセス印刷行の後にfflushを置く必要がありました(forループ内)。 –