5

サーバーとクライアントの2つのプロセスがあり、パイプ(C ++、Linux)を介して通信する必要があります。O_RDONLYサーバーはフラグでパイプを開き、クライアントは。で開きますO_WRONLY。ただし、サーバーはopen関数でブロックしますが、クライアントは正常に実行されているように見えます(open関数は成功を返し、関数も同様に返しますwrite)。

フラグが設定されている場合O_NONBLOCK、読み取り機能は続行されることを読みましたが、クライアントが接続されていない場合は続行したくありません-クライアントが接続されるまでブロックしても問題ありませんが、私の場合はブロックされたままですクライアントの実行が終了した後...

私が間違っていることを教えてくれませんか...?

コードは次のとおりです。

// Server side
int pipe;
int status, nr_read = 0;

status = mkfifo(FIFO_NAME, 0666);
if (status < 0)
{
    // If the file already exists, delete it
    unlink(FIFO_NAME);

    // Try again
    status = mkfifo(FIFO_NAME, 0666);

    if(status < 0)
    {
        printf("mkfifo error: %d\n", status);
        return status;
    }
}

pipe = open(FIFO_NAME, O_RDONLY);
printf("Never gets here...\n");
[...]
nr_read = read(pipe, my_char_array, CHAR_ARRAY_SIZE);
[...]
close(pipe);
unlink(FIFO_NAME);

「printf」行に到達することはありません...

// Client side:
int pipe, nr_sent = 0;
int status = 0;

pipe = open(FIFO_NAME, O_WRONLY);
if (pipe < 0)
{
    printf("open fifo error: %d\n", status);
    return pipe;
}

[...]
nr_sent = write(pipe, my_char_array, CHAR_ARRAY_LENGTH);
[...]
close(pipe);

編集

私はその行について言及しませんでした #define FIFO_NAME "MYFIFO"

...そしてここに問題がありました:Jody Haginsが言ったように、パスは相対的なものであり、プロセスは異なるフォルダーから開始され、彼らは異なるファイルを開こうとしていました。

4

1 に答える 1

5

読み取り側は、書き込み側がパイプを完了するまで、ブロッキングオープンを完了しません。

この機能が必要ない場合は、読み取り側を開き、O_NONBLOCKを使用selectして、書き込み側が接続を確立したときを判別し、それに応じて入力を処理します。

編集

おっと。クライアントを実行した後でもサーバーがオープンを完了していないと言ったことに気づきました。それは奇妙です。コードを切り取って貼り付け、不足しているヘッダーインクルードと不足している変数/定数を追加した後、サーバー/クライアントを実行すると、期待どおりに動作しました。

サーバーはクライアントを待機し、クライアントが実行されると、サーバーはオープンを完了してデータを読み取りました。

ファイルをチェックして、実際のFIFOがあることを確認します。

次のように表示されます。

> ls -lat /tmp/FIFO
prw-r--r-- 1 user user 0 2012-09-11 10:22 /tmp/FIFO


> stat /tmp/FIFO
  File: `/tmp/FIFO'
  Size: 0               Blocks: 0          IO Block: 4096   fifo
Device: 6802h/26626d    Inode: 186603      Links: 1
Access: (0644/prw-r--r--)  Uid: (10042/ user)   Gid: (10042/ user)
Access: 2012-09-11 10:22:48.000000000 -0400
Modify: 2012-09-11 10:22:48.000000000 -0400
Change: 2012-09-11 10:22:48.000000000 -0400
于 2012-09-11T14:09:57.293 に答える