進程的概念和IO通常是分離。除了發送給父PID的unix(kill)信號傳播給孩子之外,在子進程和父進程之間沒有信號交換。
Waitpid只是等待終止一個子pid,返回其狀態碼。
如果您想要在父級和子級之間交換數據,您需要在兩個進程之間創建一個pipe
(請參閱man -s 2 pipe
),請參閱手冊頁中的示例。
如果你想在孩子使用scanf
(從標準輸入),你需要將pipefd[0]
綁定到標準輸入文件描述符0
(或STDIN_FILENO)。
現在,您可以在父進程中使用select
或poll
來檢查孩子是否已準備好讀取由父級發送給pipefd[1]
的數據。
如果使用printf
或其他一些stdio.h
方法寫入孩子(通過STDOUT_FILENO爲例),在父母的IO可能阻止反正就算select
或poll
告訴孩子準備好接收數據,如果孩子讀得太慢或停止閱讀太早,輸出緩衝區已滿(我認爲它的默認大小爲4096字節)。
一個unistd.h
寫調用可能返回一個值
nw = write(pipefd[1], buffer, nbytes);
nw < nbytes
如果孩子不讀的輸入,許多(nbytes
)字節。
因此,在進行異步通信時要小心絆倒危險。當您瞭解異步方法時,請檢查CSP(通信順序進程)方法,作爲使用同步通信的另一種更穩定的通信方法。
如果你解釋你想要達到的目標會更好。這是一件很奇怪的事情,所以對於你想解決的實際問題,可能有更好的解決方案。 –
我將編輯。謝謝你的提示。 – Psyny