2011-07-20 72 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); 
     } 
} 
相關問題