2014-11-16 30 views
0

我不明白waitpid()函數。手冊上說:爲什麼waitpid(-1,&status,0)不暫停沒有任何孩子的進程?

The wait() system call suspends execution of the calling process until one of its children terminates. The call wait(&status) is equivalent to: waitpid(-1, &status, 0);

來源:http://manpages.ubuntu.com/manpages/raring/man2/wait.2.html

據我明白這一點:如果我有一個過程,沒有子進程什麼那麼並調用waitpid(-1, &status, 0)功能,那麼這個過程應該掛在那裏,不要繼續下去,因爲如果沒有孩子,永遠不會有狀態變化,所以這個過程只是掛在那裏,等待子進程改變狀態,在這種情況下永遠不會發生,但這種理解似乎是錯誤的,因爲代碼下面不掛在waitpid()函數。相反,它返回-1錯誤,這似乎是合理的,因爲沒有任何子進程,但根據手冊我的理解程序應該掛在/在waitpid()函數並等待孩子改變狀態。然而,沒有孩子,所以沒有地位變化,所以它應該掛在waitpid()函數中並等待。下面的代碼不應該達到printf()語句,而是它會到達printf()函數。

此代碼只是爲了演示puposes:

#include <sys/wait.h> 
#include <sys/types.h> 
#include <stdio.h> 

int main() { 
    int status; 
    pid_t pid; 
    pid = waitpid(-1, &status, 0); 
    printf("%i\n", (int) pid); // pid returns -1 
    return 0; 
} 

該程序執行,直到結束,但據我瞭解,根據手冊它不應該。我的上述推理有什麼問題?

+0

沒有孩子,所以聲明不成立 - 因此不需要掛起。 –

回答

2

顯然,其意圖是,通過返回-1,它表示沒有孩子可以等待(從某種意義上說,所有兒童已終止)。

+0

我明白了。這正是我所懷疑的,但我無法從手冊中提取這些信息。所以我想以編程的方式找出答案。 – user3542317

+0

[手冊](http://pubs.opengroup.org/onlinepubs/9699919799/functions/wait.html)在* Return Value *部分和* Errors *部分中都有說明。 – Oswald

0

檢查errno找出原因,waitpid函數返回-1:

ECHILD(爲等待())調用進程沒有任何unwaited換 孩子。

ECHILD(對於waitpid函數()或waitid())通過指定的過程PID (waitpid函數())或idtype和id(waitid())不存在或不是 調用進程的子。 (如果SIGCHLD的動作設置爲SIG_IGN這種情況可能自己 孩子。也請參閱有關線程 Linux的註釋部分。)

EINTR WNOHANG沒有設置和暢通的信號或SIGCHLD是 抓住;見信號(7)。

EINVAL options參數無效。

+1

它告訴我,有「沒有子進程」。我有點期待。 – user3542317

相關問題