[英]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;
}
在Linux(Cent OS)環境中, sighandler()
將在system()
完成后觸發。 但是在Mac OS X上, sighandler()
的調用條件不同。 這是Linux與BSD / UNIX系統之間的已知區別嗎?
真正的問題是,在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.