gpt4 book ai didi

c - kill 和 signal 的准确性如何?

转载 作者:IT王子 更新时间:2023-10-29 01:05:35 25 4
gpt4 key购买 nike

测试一些 POSIX 代码,我注意到信号的使用不是很准确。这是客户端的示例代码:

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

#define MESSAGE "hello\n"
#define PAUSE 15000

int main(int argc, char **argv)
{
int pid = atoi(argv[1]);
size_t i;
int j;

for (i = 0; i < sizeof MESSAGE; ++i) {
for (j = 0; j < MESSAGE[i]; ++j) {
kill(pid, SIGUSR1);
usleep(PAUSE);
}
kill(pid, SIGUSR2);
usleep(PAUSE);
}
return 0;
}

服务器代码如下:

#include <signal.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

static unsigned char index;

static void inc(int sig)
{
++index;
(void) sig;
}

static void prt(int sig)
{
printf("%c", index);
fflush(stdout);
index = 0;

(void) sig;
}

int main(void)
{
printf("%ld\n", (long int)getpid());

signal(SIGUSR1, inc);
signal(SIGUSR2, prt);

for (;;)
;

return 0;
}

服务器接收到的字符取决于客户端的 PAUSE 值。它是来自信号的限制,还是我犯了错误?如果是这样,我在哪里可以找到这些环境注意事项(我使用 Linux 2.6.35)?

注意:要执行客户端的代码,您必须在命令行参数中写入服务器的 PID。

最佳答案

不仅这种进程间通信效率极低;这也是无效的。信号不排队;它们要么是待处理的,要么是非待处理的 (*)。因此,除非接收方进程在发送方发送另一个信号之前读取信号,否则信号将会丢失。

如果你真的想做这样可怕的事情,接收方需要通过向发送方发回信号来确认它收到的每个信号,并且发送方需要等待发送下一个信号,直到前一个信号被确认。

(*) 实际上,实时信号是排队的,但是队列的深度是有限制的,确保它不超限需要痛苦和脆弱的实时优先级管理逻辑。

关于c - kill 和 signal 的准确性如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13442235/

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