2017-01-31 5 views
0

ストリーム内の文字を検索し、データを消費せずにストリームにプッシュバックしたい。 私はfgetcを使用していますが、プログラムは呼び出し側のfgetcで止まっています。ストリーム内の文字を検索し、パイプを使用してストリームをプッシュバックする方法

以下は私のテストプログラムです。

int main(void) 
{ 
    int  fd[2], nbytes; 
    pid_t childpid; 
    char string[] = "Hello, world!\n"; 
    char readbuffer[80]; 

    pipe(fd); 

    if((childpid = fork()) == -1) 
    { 
     perror("fork"); 
     exit(1); 
    } 

    if(childpid == 0) 
    { 
     /* Child process closes up input side of pipe */ 
     close(fd[0]); 

     /* Send "string" through the output side of pipe */ 
     write(fd[1], string, (strlen(string)+1)); 
     exit(0); 
    } 
    else 
    { 
     /* Parent process closes up output side of pipe */ 
     close(fd[1]); 
     int dummy; 
     fd_set set; 
     struct timeval timeout; 
     FD_ZERO (&set); 
     FD_SET (fd[0], &set); 
     timeout.tv_sec = 1; 
     timeout.tv_usec = 0; 
     if (select (fd[0]+1, &set, NULL, NULL, &timeout)) 
     { 
      dummy = fgetc (stdin); 
      ungetc (dummy, stdin); 
      // Search for character 
      if (dummy == 0x03) 
       // Todo 
     } 
    } 

    return(0); 
} 

なぜ、プログラムがfgetcにスタックしているのかが間違っています。

答えて

0

fgetcは、パイプではなく、stdin(あなたの端末)です。パイプはどこにも使用していません。あなたのコードが実際に何をしているのかを理解しよう。

dup2パイプfdを0にしようと思っていますが、標準入力はfdです。これには数千の例があります。 libcののバッファリングなし

、またはそれをyouselfを実装し、あなたはあなたが求めるものを行うことはできません - バイトがパイプから読み込まれると、それはあなたのものだとパイプから消えて。

+0

私は多くの時間を節約するパイプではなく、標準入力からのターミナル入力を使用していることを指摘してくれてありがとう。 'のungetc()'パイプに文字をプッシュバックしません: –

+0

あなたは関数がと言っていますか? – user3629249

+0

いいえ、私は言っている[ 'ungetc'](https://linux.die.net/man/3/ungetc)であるFILE *' 'ストリーム上で動作libcの関数で、 - の上にlibcの抽象化実際のファイル記述子(あなたのパイプのようなもの) –

0

私は2つの問題があると思います。 1つは、バイトがストリームから消費されたら、それを元に戻すことができないということです。第二に、fgetcは、データが使用可能になるまで、それは待機します、そしてあなたが返すようにそうでない場合(あるいはタイムアウトに達した後に返すように)fgetcを伝えることができないようなブロッキング機能です。

最初の問題のために、あなたがしてあり、プログラムとどこプリフェッチが働くだろう全体で使用されるように、バッファによって、関連するストリームをラップすることができます。

2番目の問題については、例えばnon blocking I/Oのこの(または類似の)投稿を参照してください(参考になった場合は、参照した回答をupvoteすることを忘れないでください)。

関連する問題