私は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
読み取りによるバッファ変更は有効な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
を返す必要があります メインプロトタイプを宣言します