3

ユーザーが文字列「end」を入力するまで、パイプに書き込みます。ユーザーが文字列「end」を入力すると、さらに先に進むと思います。ここでは、パイプを閉じて、「After Written to Pipe」というメッセージを出力する必要があります。しかし、「end」文字列を入力しても「After Written to Pipe」という行は印刷されません。パイプを読み取るプロセスがなくても、パイプを閉じてさらに先に進むにはどうすればよいですか?..

こんにちは、これが私のコードです。

int main() {
int fd;
char *b, *c;
printf("Enter Str : ");
b = malloc(50);
gets(b);

while(strcmp(b,"end")!=0){
    if(access("MSG",F_OK) != -1)    // check pipe is already available.
    {
        fd = open("MSG", O_WRONLY);
        write(fd, b, strlen(b) );
    }
    else
    {
        if( mkfifo("MSG", 0666) != -1)  // create pipe if not available.
        {
            fd = open("MSG", O_WRONLY);
            write(fd, b, strlen(b) );               
        }
    }
    printf("Enter Str : ");
    gets(b);
}   
close(fd);
printf("After Written to Pipe");

}
4

2 に答える 2

1

mkfifo(3)マニュアルページから:

ただし、入力または出力操作を実行する前に、両端を同時に開く必要があります。読み取り用にFIFOを開くと、通常、他のプロセスが書き込み用に同じFIFOを開くまでブロックされ、その逆も同様です。

上記の段落はwrite、FIFOから誰かが読み取っているまでブロックすることを意味します。これは、プログラムに表示されるものです。

于 2012-09-04T13:43:23.900 に答える
1

bash名前付きパイプは、ノンブロッキング モードで使用する方法がないため、ここでは適切なツールではありません。

のように動作するがブロックしないプログラミング言語でツールを作成できます。catしかし、私が見つけた結果のどれも、あなたにそれらを推薦するのに十分なほど幸せではありませんでした.

それ以外の場合はソケット (netcatとを使用localhost) のいずれかですが、コンピュータ上の他のすべてのユーザーもソケットにアクセスできるため、残念ながら安全ではありません…</p>

または、バッファとして機能するある種の通常のファイル。しかし、そこには、すでに読んだ行を削除してフラッディングしないようにする方法、競合状態、およびそれらすべての悪夢に関する問題があります。

申し訳ありませんが、ここでは本当に良い解決策はありません。これを適切な方法で解決するには、bash と cat にパッチを適用して、ノンブロッキング動作を許可するオプションを追加する必要があります。

于 2013-11-22T13:12:56.013 に答える