私は奇妙な問題を抱えています。私は現在、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;
}
dup2の戻りコードをチェックしてみましたか? – bruceg
'/ tmp'の名前は実際に使用されている名前のようにFIFOですか?バックグラウンドで動作しているのは 'Reader'か' Writter'(writer?)ですか?バックグラウンドで実行しているコマンドをどのように実行しますか?フォアグラウンドで実行しているコマンドをどのように実行しますか? Readerコードはファイル記述子 'in'を開き、それを使用しません - なぜですか?あなたはポジションリードを使用しています - なぜ何かを読む前にオフセット1024でデータがあるまで待っていますか? (FIFOの場合は、とにかくシークは意味がありません。)作者では、 "python"を実行すると不要なファイルディスクリプタが開きます。 –
データの1024オフセットを待っていません、利用可能なデータを読み込み、オフセットは最後の読み取り文字から設定されます –