[英]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(...)之前完成。
我不確定這個解釋是否足夠,所以我可以用文字制作一個小圖像:)
這就是現在的情況:
我希望它是這樣的。
感謝您的幫助!
管道是單向的,而不是雙向的,因此通用解決方案是為返回數據創建另外五個管道(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.