2016-04-24 85 views
1

我有一段代碼在某個時候分叉了一個孩子。 只有孩子的代碼是一個scanf。 父進程需要監視那朵子進程的狀態:運行 2)在scanf 3等待輸入)終止檢查一個孩子的PID是否正在等待Scanf

檢查終止 1)或不IS simples與waitpid函數和WNOHANG。問題是我不知道如何區分子進程是否正在等待輸入。

PS .:我的情況有限制,我無法將信息從孩子發送給其父母。否則,我可以在scanf之前和之後使用變量。

PS:我是在linux下

如何我可以檢查是否一個子進程在等待一個scanf函數輸入(或IO一般)的狀態進入?

+0

如果你解釋你想要達到的目標會更好。這是一件很奇怪的事情,所以對於你想解決的實際問題,可能有更好的解決方案。 –

+0

我將編輯。謝謝你的提示。 – Psyny

回答

1

進程的概念和IO通常是分離。除了發送給父PID的unix(kill)信號傳播給孩子之外,在子進程和父進程之間沒有信號交換。

Waitpid只是等待終止一個子pid,返回其狀態碼。

如果您想要在父級和子級之間交換數據,您需要在兩個進程之間創建一個pipe(請參閱man -s 2 pipe),請參閱手冊頁中的示例。

如果你想在孩子使用scanf(從標準輸入),你需要將pipefd[0]綁定到標準輸入文件描述符0(或STDIN_FILENO)。

現在,您可以在父進程中使用selectpoll來檢查孩子是否已準備好讀取由父級發送給pipefd[1]的數據。

如果使用printf或其他一些stdio.h方法寫入孩子(通過STDOUT_FILENO爲例),在父母的IO可能阻止反正就算selectpoll告訴孩子準備好接收數據,如果孩子讀得太慢或停止閱讀太早,輸出緩衝區已滿(我認爲它的默認大小爲4096字節)。

一個unistd.h寫調用可能返回一個值

nw = write(pipefd[1], buffer, nbytes); 

nw < nbytes如果孩子不讀的輸入,許多(nbytes)字節。

因此,在進行異步通信時要小心絆倒危險。當您瞭解異步方法時,請檢查CSP(通信順序進程)方法,作爲使用同步通信的另一種更穩定的通信方法。

+0

感謝您的解決方案。我用管道運行了一些睾丸,似乎解決了我的問題。另外,我的IO和過程的概念是錯誤的,這個答案幫助我整理了我的想法。 – Psyny

1

您使用的是<Windows.h>?這是你想要找到的嗎?

WaitForInputIdle

等待,直到指定的過程已完成處理其初始輸入端,並等待用戶輸入在沒有輸入之前,或者直到超時間隔是否已經過去。有關API

HANDLE hProc; 
// get hProc here 
WaitForInputIdle(hProc, INFINITE); // wait forever until input idle 
// do something here 

更多信息可以在這裏找到: https://msdn.microsoft.com/en-us/library/windows/desktop/ms687022(v=vs.85).aspx

+0

對不起,我還沒有定義。我在linux下。 我會盡力找到相應的,謝謝! – Psyny