gpt4 book ai didi

c - fork 和信号 : how to send signals from parent process to specific child process

转载 作者:太空宇宙 更新时间:2023-11-04 12:36:36 24 4
gpt4 key购买 nike

我需要fork 两个子进程。一个可以接收信号 3,打印 hello 并将信号 4 发送给另一个子进程;另一个可以接收信号4,打印world并将信号3发送给第一个子进程。
启动时,父进程会在休眠 3 秒后向第一个子进程发送信号 3。
然后 3 秒后,父进程将发送 SIGKILL 来杀死它们。

我不知道如何向特定的子进程发送信号(我知道我们有一个函数 kill 来发送信号,但我不知道在这里使用它)。

这是我的代码:

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

void func(int n)
{
printf("ping\n");
// how to send signal 4 to the second process?
}

void func2(int n)
{
printf("pong\n");
// how to send signal 3 to the first process?
}

int main()
{
pid_t pid;
int i;
for(i = 0; i < 2; i++)
{
pid = fork();
if(pid == 0)
{
if(i == 0)
{
signal(3, func);
}
else
{
signal(4, func2);
}
while(1);
}
else
{
if(i == 1)
{
sleep(3);
// how to send signal 3 to the first child process?
sleep(3);
// how to kill the two children?
}
}
}


return 0;
}

最佳答案

您可以使用 popen() 函数通过 fork 和打开到该进程的管道来打开该进程(而不是直接使用 fork())

父进程知道每个进程的 PID,因此可以轻松地将第二个子进程的 pid 传递给第一个子进程。

第一个 child 可以使用 pid 和 kill()` 函数将信号传递给第二个 child 。

所以,使用 popen() 来启动第一个 child 。使用 fork() 启动第二个 child ,然后通过使用 popen() 创建的流将 pid 从第二个 child 传递给第一个 child 。

未正确处理调用 fork() 返回的 pid 值。

发布的代码假设对 fork() 的调用是成功的......这不是一个安全/有效的假设

代码还需要检查 pid 是否为 -1 并适本地处理该错误。

当子进程完成时,它不应处于 while() 循环中,而应使用 exit() 函数退出。

父进程不应该只是退出,因为这会使两个子进程成为僵尸进程。 (如果不重启系统,僵尸很难摆脱。)

相反,父进程应该调用 wait() 或更好的 waitpid()(并记住子进程需要实际退出,而不是坐在 while() 循环。

1) func()func2() 应该检查参数以确保它是正在处理的正确信号。

2) signal() 的手册页表明不应使用它。手册页建议使用:sigaction(),

关于c - fork 和信号 : how to send signals from parent process to specific child process,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41549436/

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