簡體   English   中英

執行完后殺死一個子進程(在fork之后)

[英]killing a child process (after fork) once its execution is done

我正在編寫一個簡單的Web服務器。 程序的簡化形式如下

while(1)
{
     // accepting the connection.
     accept();

     pid = fork();

     if(pid == 0)
     { 
          // performing some operations
          _exit(EXIT_SUCCESS);

     } else {

          sleep(1);
     }
}

因此,一旦子進程執行,它便應終止,而父進程應繼續接受連接。 但是,對我來說,子進程不會終止,甚至它(子進程)也接受連接。 我在這里犯任何錯誤嗎?

我能夠看到該進程(子進程)沒有被殺死。

top -U <username>

我需要幫助。 提前致謝。 :)

父進程必須調用wait以“收獲”子進程。

您需要“等待”子進程的原因是因為在退出進程后,仍然存在用於子進程的退出代碼的資源。 wait (及其同級系統調用)所做的不僅是等待子進程結束,還獲得退出代碼,以便操作系統可以正確清理子進程。 如果父進程在退出之前不等待所有子進程退出,則所有子進程將變為孤立進程,並將進程ID為1的進程設置為其父進程。

首先,感謝大家對我的幫助。 我的代碼有誤。 :)

問題出在接受連接和分支之后,在子進程中,我使用諸如accept方法之類的文件描述符close()了socket連接。

accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);

然后應該在子進程中調用close(sockfd) 由於未在子進程中關閉該套接字,因此該套接字仍在accept()連接。 因此,盡管如此,在關閉關聯的套接字文件描述符之前,不會給_exit()子進程終止。

與此相關,在父進程中,我們必須調用wait()waitpid()具體取決於您需要從進程表中刪除子進程並避免其僵屍狀態。

暫無
暫無

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

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