【发布时间】:2015-10-24 16:26:49
【问题描述】:
是否可以确保 C 中的信号调用顺序?我们看下面的代码:
//main.c
int counter;
pid_t pid;
void alrm_handler(int s)
{
kill(pid, SIGUSR1);
alarm(1);
--counter;
if (counter == 0)
kill(pid, SIGTERM);
printf("%d\n", counter);
fflush(stdout);
}
int main(int argc, char* argv[])
{
counter = atoi(argv[1]);
signal(SIGALRM, alrm_handler);
alarm(1);
pid = fork();
if (!pid)
execl("child", "child", NULL);
wait(NULL);
return 0;
}
//child.c
void usr1_handler(int s)
{
puts("TEXT");
fflush(stdout);
}
int main()
{
signal(SIGUSR1, usr1_handler);
while(1)
{
struct timespec T;
T.tv_nsec = 100;
T.tv_sec = 0;
nanosleep(&T, NULL);
}
return 0;
}
即使我发送 SIG_USR1 3 次,我也只能得到 2 次输出。似乎 SIGTERM 具有更高的优先级或其他东西。在这种情况下如何实现 3 个输出?
【问题讨论】:
-
发布的代码实现了一个嵌套/递归信号处理程序,这是一个禁忌。发布的代码实现了对 I/O 函数
printf()的调用,这是一个禁忌。第一个发布的代码不正确地处理来自 fork() 的返回值,并且似乎期望对 execl() 的调用永远不会失败。 -
我不是在问这段代码有什么错误(为了简单起见,我省略了一些东西)。我所要求的只是一种确保 sigterm 不会在 sigusr1 之前到达的方法。我认为这并不总是可能的。 SIGTERM 可能比 SIGUSR1 具有更高的优先级,这就是它们按此顺序到达的原因。
-
该网站的大多数程序员都是“新人”,不会知道“来自辣椒的错误”。所以我尝试指出实际问题范围之外的编码问题,以便“新”程序员可以学习
标签: c unix concurrency