gpt4 book ai didi

c - Linux system() 和信号处理程序导致竞争条件?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:32:17 24 4
gpt4 key购买 nike

我遇到了如下代码的问题:

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() 绑定(bind)。但是后来发现在子窗口GTK Button的回调函数中调用system()总是返回-1。我完全确定 SIGCHLD 没有与 SIG_IGN 绑定(bind),它仍然绑定(bind) sighandler()是否有可能 sighandler() 中的 waitpidsystem()< 中的 waitpid() 之前捕获死掉的子进程 用于处理死掉的子进程?

最佳答案

这是 system 的 POSIX 规范关于 SIGCHLD 说:

The system() function shall ignore the SIGINT and SIGQUIT signals, and shall block the SIGCHLD signal, while waiting for the command to terminate.

Blocking SIGCHLD while waiting for the child to terminate prevents the application from catching the signal and obtaining status from system()'s child process before system() can get the status itself.

Note that if the application is catching SIGCHLD signals, it will receive such a signal before a successful system() call returns.

最后一点是因为当 system() 取消阻塞 SIGCHLD 时,未决信号被传递,并且它转到应用程序的处理程序。

关于c - Linux system() 和信号处理程序导致竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25061426/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com