簡體   English   中英

Linux system()和信號處理程序導致競爭狀況?

[英]Linux system() and signal handler cause a race condition?

我遇到了類似的代碼問題:

void sighandler(int signo)
{
    printf("sighandler() called\n");

    pid_t pid;
    pid = waitpid(-1, NULL, WNOHANG);
    if(pid >= 0)
    {
        printf("Caught by sighandler(): pid = %d\n", pid);
    }
    else
    {
        perror("sighandler pid failed");
    }
}


int main(void)
{
    int ret = 0;
    pid_t pid;

    signal(SIGCHLD, sighandler);

    ret = system("ls -al");

    if(ret < 0)
    {
        perror("system failed");
        printf("return value is %d\n", ret);
    }

    return 0;
}
  1. 在Linux(Cent OS)環境中, sighandler()將在system()完成后觸發。 但是在Mac OS X上, sighandler()的調用條件不同。 這是Linux與BSD / UNIX系統之間的已知區別嗎?

  2. 真正的問題是,在GTK(C語言)程序中, SIGCHLD在主例程中與sighandler()綁定。 但是后來我發現在子窗口GTK Button的回調函數中調用的system()始終返回-1。 我完全確定SIGCHLD不會與SIG_IGN綁定,並且仍與sighandler()綁定。 sighandler()中的waitpid是否有可能在system()中用於處理死子進程的waitpid()之前捕獲死子進程?

這是關於SIGCHLD系統 POSIX規范所說的:

在等待命令終止時,system()函數將忽略SIGINT和SIGQUIT信號,並阻塞SIGCHLD信號。

在等待子進程終止時阻塞SIGCHLD可以防止應用程序在system()獲取狀態本身之前捕獲信號並從system()的子進程中獲取狀態。

請注意,如果應用程序正在捕獲SIGCHLD信號,它將在成功的system()調用返回之前接收到此類信號。

最后一點是因為當system()解除對SIGCHLD的阻止時,將傳遞掛起的信號,並將其傳遞給應用程序的處理程序。

暫無
暫無

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

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