【发布时间】:2021-01-20 20:54:45
【问题描述】:
使用 SIGSTOP 停止子进程后,我想使用 SIGALRM 每 3 秒执行一次子进程, 但处理程序不起作用。这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
void singAlrm(int sig)
{
printf("HELLO from SIGALRM");
kill(getpid(), SIGCONT);
}
int main()
{
int Sense1 = 1;
int Sense2 = 0;
int pid1 = fork();
signal(SIGALRM, singAlrm);
if (pid1 == 0)// fils1
{
while (1)
{
kill(getpid(), SIGSTOP);
if (Sense1 == 1)
{
printf("sense 1 working \n");
Sense1 = 0;
}
else
{
printf(" sense 1 not working\n");
Sense1 = 1;
}
}
exit(0);
}
else// pere
{
int pid2 = fork();
if (pid2 == 0)
{
while (1)
{
kill(getpid(), SIGSTOP);
if (Sense2 == 1)
{
printf("sense 2 is not working\n");
Sense2 = 0;
}
else
{
printf("sense 2 is working\n");
feuCouleurSenseBA = 1;
}
}
exit(0);
}
else
{
while (1)
{
sleep(3);
signal(SIGALRM, singAlrm);
kill(pid2, SIGALRM);
kill(pid1, SIGALRM);// here I have a problem when I call SIGALRM
}
}
}
}
我想得到结果
sense 1 is working
sense 2 is not working
sense 1 is not working
sense 2 is working
.
.
【问题讨论】:
-
被 SIGSTOP 停止的进程在收到 SIGCONT 之前不会做任何事情。您可能想改用sigsuspend 或sigwaitinfo,或者更好的是,找到一种根本不使用信号的方法。
-
是的,我知道,但我在处理程序中使用 SIGCONT,但我不知道为什么它不执行。
-
推荐使用 sigaction() 而不是 signal()。来自 Ubuntu 20.04 上的“man signal”:“signal() 的唯一可移植用途是将信号的处置设置为 SIG_DFL 或 SIG_IGN。使用 signal() 建立信号处理程序时的语义因系统而异(以及 POSIX.1 显式允许这种变化);请勿将其用于此目的。”
-
@karim SIGALRM 处理程序不会运行,直到 已停止的进程收到某个未停止的进程发送的 SIGCONT。
-
应该
feuCouleurSenseBA = 1;真的是Sense2 = 1;吗?
标签: c linux bash multithreading signals