簡體   English   中英

Waitpid和fork / exec在系統調用方面的非阻塞優勢?

[英]Waitpid and fork/exec's non-blocking advantage over a syscall?

我總是聽到您永遠不要使用system() ,而應該使用fork/exec因為system()會阻止父進程。

如果是這樣,我是否通過調用waitpid()做錯了事,當我執行fork/exec時, waitpid()也阻塞了父進程? 有沒有辦法解決waitpid ...我一直認為在進行fork/exec時有必要。

pid_t pid = fork();

if (pid == -1)
{
    // failed to fork
} 
else if (pid > 0)
{
    int status;
    waitpid(pid, &status, 0);
}
else 
{
    execve(...);
}

WNOHANG標志(在options參數中設置)將使對waitpid()的調用無阻塞。

您必須定期調用它以檢查孩子是否已經完成。

或者,您可以設置SIGCHLD來照顧孩子。

如果您想在子進程關閉時做其他事情,則可以為SIGCHLD設置陷阱,以處理子進程的完成/退出。 就像在這個非常簡單的示例中一樣。

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

pid_t pid;
int finished=0;

void zombie_hunter(int sig)
    {
    int status;
    waitpid(pid, &status, 0);
    printf("Got status %d from child\n",status);
    finished=1;
    }

int main(void)
    {
    signal(SIGCHLD,zombie_hunter);

    pid = fork();

    if (pid == -1)
        {
        exit(1);
        } 
    else if (pid == 0)
        {
        sleep(10);
        exit(0);
        }

    while(!finished)
        {
        printf("waiting...\n");
        sleep(1);
        }
    }

我總是聽到您永遠不要使用system() ,而應該使用fork/exec因為system()會阻止父進程。

永遠不要把話說絕了。 如果system()具有您想要的語義,包括但不限於阻止調用過程,則請務必使用它! 不過,請確保您了解所有這些語義。

如果您的目標是避免阻塞父進程,那么了解父進程可以在派生孩子與通過其中的一個wait()函數集進行收集之間執行無窮的工作量,這一點很重要。 這非常類似於啟動新線程,繼續進行其他工作,然后最終加入線程。

而且,如果父母不需要知道或關心孩子何時終止,那么就可以完全避免等待。

暫無
暫無

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

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