用户定义信号 sigusr1 和 sigusr2
user defined signals sigusr1 and sigusr2
我正在构建一个简单的软件,其中有多个进程使用用户定义的信号 SIGUSR1 和 SIGUSR2 相互通信。
我只是想知道在我下面描述的场景中会发生什么。
“Process-1 确实使用 kill 命令将 sigusr1 发送到 process-2,并且 process-2 正在执行信号处理程序进行一些计算。甚至在 process-2 完成信号处理程序的执行之前,process-1 发送 sigusr1再次到 process-2。会发生什么。对于这个我无法得到正确的答案。我想到了两种可能的情况。
- 当前正在执行的处理程序被中断了?或
- 进程 2 将忽略第二个信号。
请指教。
我一个月前构建了一个与您类似的程序,其目标是使用信号将文本从一个进程发送到另一个进程。根据我的经验,如果您不等待 process-2 完成其计算,则 process-1 发送的信号将被第二个进程忽略,您的消息/数据将丢失。
为了避免这种情况发生,我建议您从 process-2 发回一个信号,告诉 process-1 计算已经结束,它可以发送另一条消息。
处理信号需要一些时间,如果您一次发送太多,有些信号可能会被忽略。
您可以做的是向其他进程发送响应信号,基本上是这样说:
Hey, I got your signal, send me the next one I'm ready
这样,任何信号都不会被忽略,您的程序将变得更快,错误更少甚至没有。
如果你想要一个便宜的解决方案,只需使用 usleep()
和一个小值(实际上取决于你的硬件)
这是一个使用信号将 ascii 消息发送到另一个进程的示例:
Client - Sending part
void decimal_conversion(char ascii, int power, int pid)
{
if (power > 0)
decimal_conversion(ascii / 2, power - 1, pid);
if ((ascii % 2) == 1)
kill(pid, SIGUSR1);
else
kill(pid, SIGUSR2);
usleep(1);
}
void ascii_to_binary(char *str, int pid)
{
int i;
i = 0;
while (str[i] != '[=10=]')
{
decimal_conversion(str[i], 7, pid);
i += 1;
}
}
Server
void sighandler(int signum)
{
static int ascii = 0;
static int power = 0;
if (signum == SIGUSR1)
ascii += 1 << (7 - power);
if ((power += 1) == 8)
{
putchar(ascii);
power = 0;
ascii = 0;
}
}
int main(void)
{
signal(SIGUSR1, sighandler);
signal(SIGUSR2, sighandler);
while (42);
return (0);
}
我正在构建一个简单的软件,其中有多个进程使用用户定义的信号 SIGUSR1 和 SIGUSR2 相互通信。
我只是想知道在我下面描述的场景中会发生什么。
“Process-1 确实使用 kill 命令将 sigusr1 发送到 process-2,并且 process-2 正在执行信号处理程序进行一些计算。甚至在 process-2 完成信号处理程序的执行之前,process-1 发送 sigusr1再次到 process-2。会发生什么。对于这个我无法得到正确的答案。我想到了两种可能的情况。
- 当前正在执行的处理程序被中断了?或
- 进程 2 将忽略第二个信号。
请指教。
我一个月前构建了一个与您类似的程序,其目标是使用信号将文本从一个进程发送到另一个进程。根据我的经验,如果您不等待 process-2 完成其计算,则 process-1 发送的信号将被第二个进程忽略,您的消息/数据将丢失。
为了避免这种情况发生,我建议您从 process-2 发回一个信号,告诉 process-1 计算已经结束,它可以发送另一条消息。
处理信号需要一些时间,如果您一次发送太多,有些信号可能会被忽略。
您可以做的是向其他进程发送响应信号,基本上是这样说:
Hey, I got your signal, send me the next one I'm ready
这样,任何信号都不会被忽略,您的程序将变得更快,错误更少甚至没有。
如果你想要一个便宜的解决方案,只需使用 usleep()
和一个小值(实际上取决于你的硬件)
这是一个使用信号将 ascii 消息发送到另一个进程的示例:
Client - Sending part
void decimal_conversion(char ascii, int power, int pid)
{
if (power > 0)
decimal_conversion(ascii / 2, power - 1, pid);
if ((ascii % 2) == 1)
kill(pid, SIGUSR1);
else
kill(pid, SIGUSR2);
usleep(1);
}
void ascii_to_binary(char *str, int pid)
{
int i;
i = 0;
while (str[i] != '[=10=]')
{
decimal_conversion(str[i], 7, pid);
i += 1;
}
}
Server
void sighandler(int signum)
{
static int ascii = 0;
static int power = 0;
if (signum == SIGUSR1)
ascii += 1 << (7 - power);
if ((power += 1) == 8)
{
putchar(ascii);
power = 0;
ascii = 0;
}
}
int main(void)
{
signal(SIGUSR1, sighandler);
signal(SIGUSR2, sighandler);
while (42);
return (0);
}