web-dev-qa-db-ja.com

Cで名前付きパイプから読み書きする方法は?

私は2つのプログラム(write.cとread.c)を持っています。標準入力から名前付きパイプに継続的に書き込み、もう一方の端でそれから読み取ります(そして標準出力に書き込みます)。私は何かを機能させましたが、正しく機能していません。反対側のプログラムは、間違った順序で読み取るか、特殊文字を読み取ります(したがって、必要以上に読み取りますか?)。また、名前付きパイプの出力を特定の文字列と比較できるようにしたいです。

とにかく、ここに両方の​​ファイルからのコードがあります:

write.c:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#define BUFFSIZE 512
#define err(mess) { fprintf(stderr,"Error: %s.", mess); exit(1); }

void main()
{
    int fd, n;

    char buf[BUFFSIZE];


    mkfifo("fifo_x", 0666);
    if ( (fd = open("fifo_x", O_WRONLY)) < 0)
        err("open")

    while( (n = read(STDIN_FILENO, buf, BUFFSIZE) ) > 0) {
        if ( write(fd, buf, strlen(buf)) != strlen(buf)) { 
            err("write");
        }
    }
    close(fd);
}

read.c:

#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFFSIZE 512
#define err(mess) { fprintf(stderr,"Error: %s.", mess); exit(1); }

void main()
{
    int fd, n;
    char buf[BUFFSIZE];

    if ( (fd = open("fifo_x", O_RDONLY)) < 0)
        err("open")


    while( (n = read(fd, buf, BUFFSIZE) ) > 0) {

        if ( write(STDOUT_FILENO, buf, n) != n) { 
            exit(1);
        }
    }
    close(fd);
}

入力例:

hello how are you
123 
test

誤った出力の例:

hello how are you
b123
o how are you
btest
 how are you
b

入力の別の例:

test
hi

そして出力:

test
hi
t
8
mythic

読み取りによるバッファ変更は有効なc文字列ではないため、

_write(fd, buf, strlen(buf)) != strlen(buf) // write.c
_

未定義の振る舞いです。やったほうがいい

_write(fd, buf, n) != n
_

read()でnオクテットを読み取るためです。

Read.cに対しては実行しますが、write.cに対しては実行しないので面白いです。


nのタイプは_ssize_t_である必要があり、intではありません man read


main()intを返す必要があります メインプロトタイプを宣言します

5
Stargateur