簡體   English   中英

在C中將數據從父進程發送到子進程,反之亦然

[英]Sending data from parent to child process and vice versa in C

我創建了一個程序,在循環中創建5個管道和fork 5進程。 當每個子進程與另一個程序重疊時,我已設法將數據從父進程發送到每個子進程。 每個循環以下列方式完成

parent.c ):

// Child process - reads from pipe
if (childpid == 0) {
    dup2(fd[0], 0); // replace stdin with pipe input
    execv("program", arguments);

} else { // Parent process - writes to pipe
    write(fd[1], buffer, strlen(buffer)+1);
}

所以現在我可以通過讀取子程序用execv(...)執行的程序中的STDIN_FILENO來獲取從父級發送到管道的數據。

像這樣( program.c ):

char *buffer = (char *)malloc(50);
read(STDIN_FILENO, buffer, 50);

不過我的問題是,如何將數據發送回父母? 我想的是再次使用dup2替換stdout和管道輸出,但我無法讓它工作。 我意識到必須在至少使用execv(...)之前完成。


我不確定這個解釋是否足夠,所以我可以用文字制作一個小圖像:)

這就是現在的情況:

  • 父 - >管道
  • 管道 - >子進程1
  • 管道 - >子進程2
  • 管 - > ......
  • 管道 - >子進程5

我希望它是這樣的。

  • 父 - >管道
  • 管道 - >子進程1
  • 管道 - >子進程2
  • 管 - > ......
  • 管道 - >子進程5
  • 子進程1 - >父進程
  • 子進程2 - >父進程
  • ...
  • 子進程5 - >父進程

感謝您的幫助!

管道是單向的,而不是雙向的,因此通用解決方案是為返回數據創建另外五個管道(gak!)。 然后,父進程需要使用select()系統調用來知道哪些返回管道已准備好讀取數據。

哦,我會寫的

dup2(fd[0], 0); // replace stdin with pipe input
應該
\n     dup2(fd [0],0);  //用管道輸出替換stdin\n
反之亦然。

與其他回復一樣,根據您要實現的目標,還有其他通信方法可能更合適。

看到這個UNIX編程常見問題在這里,看問題1.5,使用也許內存映射允許父/子進程讀取從兩端/寫...有一個很好的指南,了解IPC 這里

如果您想繼續使用管道,那么為子 - >父通信制作一組FD,為父 - >子通信制作一組FD。 因此,不要使用int fd [2],而是使用int toParent [2],toChild [2]。 而不是dup2(fd [0],0),你有dup2(toChild [0],0); dup2(toParent [1],1)。

不要只是復制,而是關閉你沒有使用的FD。

我在網上看了一下。 似乎您只能使用管道進行單向通信。 這是有道理的 - 從stdin和輸出到stdout的輸入。 如果要在父進程和子進程之間進行雙向通信,請使用套接字。 還有其他方法可以實現雙向IPC。 我建議您了解有關進程間通信的更多信息。

祝一切順利。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM