/ /パイプにさらに値を書き込んで読み込むにはどうすればいいですか? - c ++、linux、process、pipe

より多くの値をパイプに書き込んで読み込むにはどうすればよいですか? - c ++、linux、process、pipe

私は、Linuxでc ++でプログラムを書いています。子プロセスは2つの長い値をパイプに書き込む必要があり、親プロセスはそれらを読み取る必要があります。今までは、このために2つの(名前付き)パイプを設定し、それぞれをwrite(fd1、&value1、sizeof(long))で書き込み、read(fd1、&value1、sizeof(long))で読み取りました。 どちらのパイプもちょうど良いでしょうが、これをどうやって行うのか分かりませんでした。

私は試した:

write(fd1,&value1,sizeof(long));

write(fd1,&value2,sizeof(long));

2回の読み込みもありますが、これはプロセスをブロックしてお互いを待っているようです。

誰かが私にヒントを与えて、これをどう実現するかが大変うれしいです。

可能な解決策:私は配列のすべての値を書きました(なぜなら私はいくつのことが分かっていたからです)。

回答:

回答№1の場合は3

それは正常に動作するはずです。ここには非常に簡単な例があります。これは主にコードのコピーです マニュアルページの例から.

int main(int argc, char *argv[])
{
int fd[2];
pid_t cpid;
int ret;
int val = 0;
if (pipe(fd) == -1)
{
perror("pipe"); exit(EXIT_FAILURE);
}
cpid = fork();
if (cpid == -1)
{
perror("fork"); exit(EXIT_FAILURE);
}
if (cpid == 0) {
// close write end of pipe in child
close(fd[1]);
ret = read(fd[0], &val, sizeof( val ));
printf( "1: result = %d, value = %dn", ret, val );
ret = read(fd[0], &val, sizeof( val ));
printf( "2: result = %d, value = %dn", ret, val );
close(fd[0]);
_exit(EXIT_SUCCESS);
}
else {
// close read end of pipe in parent
close(fd[0]);
val = 42;
if ( write(fd[1], &val, sizeof(val)) < 0 )
perror( "write" );
val++;
if ( write(fd[1], &val, sizeof(val)) < 0 )
perror( "write" );
close(fd[1]);
wait(NULL);
exit(EXIT_SUCCESS);
}
}

回答№2の場合は1

read()の戻り値をチェックする必要があります。2つのlongは最終的に(そしておそらく)一緒に受信プロセスに送られます。この場合、受信したバッファを2つのlongに分割する必要があります。