2016-06-25 16 views
1

に表示されていない私は、次のコードを持っている:子供のprintfは、親プロセスのコンソール

この出力になり
#include <sys/types.h> 
#include <sys/wait.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <string.h> 
#include <stdlib.h> 

// child process is forked. 
// the child executes "ls -al" 
// the parent process "waits" for the child and collects it 

int main(void) { 

    char *args[3]; 
    pid_t pid; 

    printf("i am a parrent and my pid=%d\n",getpid()); 
    if ((pid = fork()) < 0) 
     fprintf(stderr, "fork error"); 
    else if (pid == 0) { 
     /* child */ 
     printf("i am a child and my pid=%d",getpid()); 
     args[0] = strdup("ls"); 
     args[1] = strdup("-al"); 
     args[2] = NULL; 
     if (execvp(args[0], args) < 0) 
      fprintf(stderr, "exec error"); 
    } 
    printf("my child got pid=%d\n",pid); 
    /* parent */ 
    if (waitpid(pid, NULL, 0) < 0) 
     fprintf(stderr, "waitpid error"); 
    exit(0); 
} 

i am a parrent and my pid=11745 
my child got pid=11750 
total 144 
drwxr--r-- 3 student student 4096 Jun 25 21:18 . 
drwxrwxr-x 4 student student 4096 May 24 17:18 .. 

いくつかの他のファイル...

私の質問: なぜ、子供のprintf ("i am a child...")出力がコンソールに表示されず、lsの出力が?親プロセスと同じコンソールに表示するにはどうすればよいですか?

+1

メッセージにキャリッジリターンを追加します。 'printf("私は子供で、自分のpid =%d \ n "、getpid());' – wildplasser

+0

今は動作しますが、なぜそれが "\ n"なくなっていないのですか? –

+0

\ rはキャリッジリターンです\ nは改行です – Shiro

答えて

0

まずあなたがforkfflush(stdout);を必要とするか、あるいは、あなたはおそらく、あなたが親のとあなたの子供の標準出力バッファしているの両方で printf("i am a parrent and my pid=%d\n",getpid());の出力を持っているつもりです。 execは、以前のプロセスイメージと出力バッファを完全に浪費しているので、execコールの前にfflush(stdout)またはfcloseall()が必要です。

また、回線のバッファリングに切り替えることも、オフにすることもできます。

execエラーの処理では、エラーを印刷する以外にも_exitを追加する必要があります。そうでない場合は、親のルートを続行します。

関連する問題