2017-01-16 10 views
1

私は奇妙な問題を抱えています。私は現在、2つのプログラムを作成しています.1つはバックグラウンドで実行され、もう1つは出力を読み込み、もう1つはバックグラウンドで実行されるプログラムへの入力を可能にします。C - dup2 stdinはdup2 stdoutを作成し、stderrは印刷を停止します

問題は、私が行を置くときdup2(in, STDIN_FILENO)バックグラウンドで実行されているプログラムがファイルへの印刷を停止することです。

リーダー:

#include <stdio.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
int main() 
{ 

    int out, err, in; 
    size_t i = 0, j = 0; 
    int offErr = 0, offOut = 0; 
    char bufErr[1024]; 
    char bufOut[1024]; 
    char *cFifo = "/tmp/out"; 
    char *cFifoErr = "/tmp/err"; 
    char *cFifoIn = "/tmp/in"; 

    out = open(cFifo, O_RDONLY|O_CREAT, 0600); 

    err = open(cFifoErr, O_RDONLY|O_CREAT, 0600); 

    in = open(cFifoIn, O_WRONLY|O_CREAT, 0600); 


    while(1) 
    { 
     memset(bufOut, 0, 1024); 
     memset(bufErr, 0, 1024); 
     i=0; 
     j=0; 
     while(!i && !j) 
     { 
      j = pread(err, bufErr, 1024, offErr); 
      i = pread(out, bufOut, 1024, offOut); 
      offOut +=i; 
      offErr +=j; 
     } 
     if(i) 
      write(STDOUT_FILENO, bufOut, 1024); 
     if(j) 
      write(STDOUT_FILENO, bufErr, 1024); 

    } 
    return 0; 
} 

とWriter(背景):

あなたはコメントを解除
#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <fcntl.h> 
int main() 
{ 
    int out, in, err; 

    char *cFifo = "/tmp/out"; 
    char *cInFifo = "/tmp/in"; 
    char *cErrFifo = "/tmp/err"; 

    out = open(cFifo, O_RDWR|O_CREAT|O_TRUNC, 0600); 
    in = open("/tmp/in", O_RDWR|O_CREAT|O_TRUNC, 0600); 
    err = open(cErrFifo, O_RDWR|O_CREAT|O_TRUNC, 0600); 

    dup2(out, STDOUT_FILENO); 
    dup2(err, STDERR_FILENO); 
    //dup2(in, STDIN_FILENO); //if I uncomment this it stops printing to out or err 

    system("python"); 

    while(1); 
    return 0; 
} 
+0

dup2の戻りコードをチェックしてみましたか? – bruceg

+0

'/ tmp'の名前は実際に使用されている名前のようにFIFOですか?バックグラウンドで動作しているのは 'Reader'か' Writter'(writer?)ですか?バックグラウンドで実行しているコマンドをどのように実行しますか?フォアグラウンドで実行しているコマンドをどのように実行しますか? Readerコードはファイル記述子 'in'を開き、それを使用しません - なぜですか?あなたはポジションリードを使用しています - なぜ何かを読む前にオフセット1024でデータがあるまで待っていますか? (FIFOの場合は、とにかくシークは意味がありません。)作者では、 "python"を実行すると不要なファイルディスクリプタが開きます。 –

+0

データの1024オフセットを待っていません、利用可能なデータを読み込み、オフセットは最後の読み取り文字から設定されます –

答えて

0

:あなたはPythonは空のファイル(それから読んで作っている

//dup2(in, STDIN_FILENO); //if I uncomment this it stops printing to out or err 

あなたがそれを開いたときに作成された、そして/または切り詰められた)ので、Pythonは何もして終了しません。

あなたのリーダーコードは、何も役に立たないループのwhile (1) ;に座っています。

少なくとも、ステートメントの後にprintf()を追加すると、Pythonコマンドが完了した時点を知ることができます。

+0

これを実行しました、それは問題ではなく、fflsh(stdout) –

+0

が送られてきました。ありがとう:) –

+0

Pythonコマンドを実行する前に入力ファイルに書き込むことがないので、変数名が示唆するように 'cInFifo'などの名前が実際にFIFOであるかどうか、私の質問に答えなかったので、 'O_CREAT'オプションが示唆しているように、あなたが何が起こるかを知るのは難しいです。しかし、額面で、コード化されていて、設定なしでPythonを空の入力で実行すると、Pythonはすぐに(正常に)終了します。次に、ライタープロセスはスピンループに落ちます。オープンエラーをテストしません。 'pread()'から '-1'を得るかもしれません。 –

関連する問題