我在linux下用c ++编写一个程序,其中子进程应该将两个long值写入管道,父进程应该读取它们。到现在为止,我onlz设法为此设置两个(命名)管道,并通过写入(fd1,& value1,sizeof(long))写入每个管道并通过读取读取(fd1,& value1,sizeof(long)) )。 两个管道只有一个管道会更好但我无法弄清楚如何做到这一点。
我试过了:
write(fd1,&value1,sizeof(long));
write(fd1,&value2,sizeof(long));
还有两个读取,但这似乎导致进程阻塞并等待彼此。
如果有人能给我一个暗示,如何实现这一点,我会很高兴。
可能的解决方案:我在数组中写了所有值(因为我知道有多少),然后我只需要一个有线/读取调用。
答案 0 :(得分:3)
应该可以正常工作。这是一个非常简单的例子。它主要是代码from the example in the man page的副本。
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 = %d\n", ret, val );
ret = read(fd[0], &val, sizeof( val ));
printf( "2: result = %d, value = %d\n", 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);
}
}
答案 1 :(得分:1)
您应该检查read()的返回值,最终(并且可能)将两个long一起发送到接收进程。在这种情况下,您需要将接收的缓冲区拆分为两个长整数。