2016-05-18 6 views
0

STDOUTをファイルにリダイレクトできません。C子プロセスでexecによって呼び出されたプロセスのstdoutをファイルにリダイレクト

私には2つのプロセスがあります。これらは5秒間実行してから殺す必要があります。

プロセス1:は、そのSTDOUTをパイプにリダイレクトしてから、ランダムなnubersを出力します。

プロセス2:は、そのSTDINをパイプにリダイレクトし、そのSTDOUTをファイルにリダイレクトします。次に、execl()によってプロシージャappc1を呼び出します。このプロシージャは、STDOUTに出力します。

問題:ファイルout.txtには、リーダープロセスによって実行されたテストプリントが含まれていますが、appc1プロシージャのものはありません。リダイレクトをスキップしてコンソールに印刷すると、すべて正常に動作します。

プロセスを強制終了すると問題が発生する可能性がありますか?あまりにも早くファイルを閉じますか?アドバイスをありがとう、ありがとうございます。私はこれをかなりの間解決することができません。

ret = pipe(pipefd); 

if (ret == -1) { 
    printf("Error creating pipe"); 
    exit(1); 
} 

reader = fork(); 

if (reader == 0) { 
    dup2(pipefd[0], STDIN_FILENO); 

    file = fopen("out.txt", "w"); 
    if(file == NULL) fputs("Could not open file",stderr); 

    dup2(fileno(file), STDOUT_FILENO); 
    fclose(file); 

    printf("Test values: %d %d\n\n", 234, 598); 

    execl("appc1","appc1", NULL); 
} 

else { 
    printf("PARENT: forking writer\n"); 
    writer = fork(); 

    if (writer == 0) { 
     sleep(1); 
     dup2(pipefd[1], STDOUT_FILENO); 

     while (1) { 
      num1 = rand() % 1000 + 1; 
      num2 = rand() % 1000 + 1; 
      printf("%d %d\n", num1, num2); 
      sleep(1); 
     } 
    } 
    else { 
     sleep(5); 
     kill(reader, SIGUSR1); 
     kill(writer, SIGUSR1); 
     wait(NULL); 
     exit(0); 
    } 
} 

これはコードです。

ありがとうございます。

答えて

0

私はちょうどあなたのコードに基づいて次のコードを実行し、それは私のために働いた。私はあなたがappc1の実行に問題があり、execl()の後にprintl()を追加することをお勧めします。

appc1.c

#include <stdlib.h> 
#include <stdio.h> 

int main() 
{ 
    printf("Output from appc1\n"); 
} 

pipes.c

#include <stdlib.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <errno.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

int main() 
{ 
    int ret; 
    int num1, num2; 
    pid_t reader; 
    pid_t writer; 
    int pipefd[2]; 
    FILE *file; 

    printf("PARENT: creating pipe\n"); 

    ret = pipe(pipefd); 
    if (ret == -1) { 
     printf("Error creating pipe - %s", strerror(errno)); 
     exit (1); 
    } 

    printf("PARENT: forking reader\n"); 

    reader = fork(); 

    if (reader == -1) { 
     printf("failed to fork reader\n"); 
     exit (1); 

    } else if (reader == 0) { 
     printf("READER CHILD\n"); 
     ret = dup2(pipefd[0], STDIN_FILENO); 
     if (ret == -1) { 
     printf("dup2 failed on pipefd[0] %s" , strerror(errno)); 
     exit (1); 
     } 

     file = fopen("out.txt", "w"); 
     if (file == NULL) { 
     fputs("Could not open file", stderr); 
     exit (1); 
     } 

     ret = dup2(fileno(file), STDOUT_FILENO); 
     if (ret == -1) { 
     printf("dup2 failed on fileno() %s" , strerror(errno)); 
     exit (1); 
     } 

     fclose(file); 

     printf("Test values: %d %d\n\n", 234, 598); 

     execl("appc1", "appc1", NULL); 

     printf("execl failed - %s\n", strerror(errno)); 

    } else { 
     printf("PARENT: forking writer\n"); 

     writer = fork(); 

     if (writer == -1) { 
     printf("Failed forking writer\n"); 
     exit (1); 

     } else if (writer == 0) { 
      printf("WRITER CHILD\n"); 
      sleep(1); 
      ret = dup2(pipefd[1], STDOUT_FILENO); 
      if (ret == -1) { 
      printf("dup2 failed on pipefd[1] %s" , strerror(errno)); 
      exit (1); 
      } 

      while(1) { 
       num1 = rand() % 1000 + 1; 
       num2 = rand() % 1000 + 1; 
       printf("WRITER CHILD %d %d\n", num1, num2); 
       sleep(1); 
      } 

     } else { 
      printf("PARENT: sleeping\n"); 
      sleep(5); 
      printf("PARENT: sending SIGUSR1 to reader\n"); 
      kill(reader, SIGUSR1); 
      printf("PARENT: sending SIGUSR1 to writer\n"); 
      kill(writer, SIGUSR1); 
      wait(NULL); 
      exit(0); 
     } 
    } 
} 

コンソール出力:コンテンツout.txtを

pipes 
PARENT: creating pipe 
PARENT: forking reader 
PARENT: forking writer 
READER CHILD 
PARENT: sleeping 
WRITER CHILD 
PARENT: sending SIGUSR1 to reader 
PARENT: sending SIGUSR1 to writer 

Test values: 234 598 

Output from appc1 

appc1 execl()呼び出しをappc1x(存在しない)に変更したとき、out.txtには以下が含まれています。

関連する問題