gpt4 book ai didi

c - 进程间如何发送信号?

转载 作者:行者123 更新时间:2023-11-30 19:03:19 24 4
gpt4 key购买 nike

所以,我想在进程之间发送信号。

我想从子进程1开始发送一个信号,由父进程捕获,然后向子进程2发送相同的信号。当子进程2收到信号时,我想向父进程发送另一个信号,然后父子进程杀死两个子进程。

我已经尝试过这个:

new_pid = fork();
sleep(3);
switch(new_pid) {
case -1:
perror("fork failed");
exit(1);
case 0:
kill(getppid(), SIGUSR1);
sleep(3);
pause();
break;
default:
signal(SIGUSR1, trata_SIGSEGV);
sleep(3);
new_pid2 = fork();
sleep(3);
kill(new_pid2, SIGUSR1);
sleep(3);
switch(new_pid2) {
case -1:
perror("fork failed");
case 0:
signal(SIGUSR1, trata_SIGSEGV);
kill(getppid(), SIGUSR2);
sleep(3);
pause();
break;
default:
signal(SIGUSR2, trata_SIGSEGV);
kill(new_pid, SIGKILL);
kill(new_pid2, SIGKILL);
break;
}
break;

只有父子接收到信号,然后什么也不会发生并进入程序菜单)。

   void trata_SIGSEGV(int sig){

if (sig == SIGUSR1) {
printf("Received");
}

if (sig == SIGUSR2) {
printf("Received");
}

if (sig == SIGINT) {
printf("Received");
}
}

最佳答案

这里出现了几个问题。 trata_SIGSEGV 中可能还有更多内容。

  1. fork 后,您没有给进程设置时间来准备处理。当您发送默认终止信号时,它们很可能在接收者监听它们之前就杀死了接收者。 (您是否认为信号会等待信号?事实并非如此;它只是配置信号发生时应该执行的操作。)
  2. 第 19 行尝试发送 trata_SIGSEGV 信号以处理 SIGUSR2。这是行不通的。
  3. 您以开始时的问题结束 - 主执行线程在从 fork 进程到告诉调度程序简单地结束它们的处理过程中没有延迟。

在现代计算机上,即使是毫秒的延迟也可能足以设置信号处理程序。但如果您希望它们可靠地发生,则需要至少给其他进程一些延迟,以便到达它们需要的位置。

或者,我认为您可以在父级中设置信号处理程序,然后 fork 。

根据您的更新,我想知道您如何知道哪个进程收到了什么信号。我对信号处理程序的建议:

void trata_SIGSEGV(int sig) {
printf("%d received signal %d\n", getpid(), sig);
if (SIGINT == sig) exit(1);
}

此外,我注意到您在检查 fork 返回的内容之前向进程 2 发送了第一个信号,因此进程 2 在设置信号处理程序之前先向自己发出信号。在进行任何 fork 之前设置信号处理程序,因此不会出现竞争。我在自己的代码测试中验证了信号处理程序在 fork 中保留。

关于c - 进程间如何发送信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54120600/

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