2011-07-20 67 views
2

我在linux下用C++编写一个程序,其中一个子进程应该在管道中写入两个长值并且父进程应该读取它们。直到现在,我onlz设法为此设置两个(命名)管道,并通过写入(fd1,& value1,sizeof(long))写入每个管道并通过读取(fd1,& value1,sizeof(long))读取它。 只有一个管道两个会更好,但我无法弄清楚如何做到这一点。如何将更多值写入管道并读取它们?

我想:

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

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

和两次读取以及但这似乎导致阻塞,并等待对方的过程。

如果有人能给我一个提示,我会很高兴,如何实现这一点。

可能的解决方案:我写了一个数组中的所有值(因为我知道有多少),然后我只需要一个线/读电话。

+0

管道可能被缓冲你有冲洗吗? –

回答

1

您应该检查您的read()的返回值,这两个longs最终(可能)会一起发送到接收进程。在这种情况下,您需要将接收到的缓冲区拆分为两个长整型。

+0

或读入'sizeof(long)'块。 – bdonlan

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); 
     } 
} 
相关问题