簡體   English   中英

等待,wnohang ,,。 我如何使用這些

[英]waitpid, wnohang, wuntraced. How do I use these

我有點困惑。 據我了解,pid為-1的waitpid表示我等待所有孩子的完成,但是如果我在WNOHANG的waitpid中添加一個選項,則該選項表示如果沒有完成則立即退出...這似乎非常令人困惑。

我為什么要告訴計算機等待子進程完成,然后如果沒有一個子進程完成,則立即告訴計算機立即退出?

有人可以解釋這個選項和WUNTRACED選項嗎? 我不知道被追蹤意味着什么。

通常在不同情況下使用WNOHANG和WUNTRACED。

情況1:假設您有一個過程,該過程會產生一堆孩子,並且在孩子奔跑時需要做其他事情。 這些孩子有時會退出或被殺死,但是內核將保持退出狀態,直到其他進程通過wait()或waitpid()聲明退出狀態。 因此,您的父進程有時需要調用wait()/ waitpid(),以使內核擺脫子進程的殘留。 但是我們不希望wait()/ waitpid() 阻塞 ,因為在這種情況下,我們的進程還有其他需要做的事情。 我們只想收集一個死進程的狀態( 如果有的話) 這就是WNOHANG的目的。 它可以防止wait()/ waitpid()阻塞,以便您的進程可以繼續執行其他任務。 如果一個孩子死亡,其pid將由wait()/ waitpid()返回,您的進程可以對此進行操作。 如果沒有死亡,則返回的pid為0。

情況2:假設您的父進程在孩子運行時不做任何事情 您不想只是讓它做一些令人費解的for循環,因此您使用了不帶WNOHANG的普通wait()/ waitpid()。 您的進程將從執行隊列中取出,直到其中一個子進程死亡。 但是,如果您的一個孩子通過SIGSTOP 停止了怎么辦? 您的孩子不再從事您設置的任務,但父母仍在等待。 因此,從某種意義上講,您將陷入僵局,除非該孩子以某種方式繼續在您的父母和那個孩子之外繼續生活。 如果孩子被停止以及退出或被殺死,WUNTRACED允許您的父母從wait()/ waitpid()返回。 這樣,您的父母就有機會向其發送SIGCONT以繼續,殺死它,將其任務分配給另一個孩子(無論如何)。

如果傳遞-1WNOHANG ,則waitpid()將檢查是否存在任何僵屍兒童。 如果是,則收獲其中之一,並返回其退出狀態。 如果不是,則返回0 (如果存在未終止的子代)或-1 (如果不存在),並且將ERRNO設置為ECHILD (無子進程)。 如果您想知道是否有任何孩子最近死亡而不必等待一個孩子死亡,這將很有用。 在這方面非常有用。

選項WUNTRACED的記錄如下,我對此內容無添加:

WUNTRACED由pid指定的任何已停止的子進程的狀態,並且自停止以來尚未報告其狀態的子進程也應報告給請求進程。

閱讀POSIXwaitpid頁面以獲取更多詳細信息。

暫無
暫無

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

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