fork and signal:如何将信号从父进程发送到特定的子进程
fork and signal: how to send signals from parent process to specific child process
我需要 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;
}
当您 fork
时,您会得到新的 pid
。根据 kill manpage,您使用 pid
调用 kill(pid_t pid, int sig);
您可以使用 popen() 函数通过分叉并打开到该进程的管道来打开该进程(而不是直接使用 fork())
parent 知道每个进程的 PID,因此可以轻松地将第二个 child 的 pid 传递给第一个 child。
第一个 child 可以使用 pid 和 kill()` 函数将信号传递给第二个 child。
所以,使用 popen() 启动第一个 child。使用 fork() 启动第二个 child,然后通过使用 popen() 创建的流将 pid 从第二个 child 传递到第一个。
未正确处理调用 fork() 返回的 pid 值。
发布的代码假设调用 fork() 成功...这不是 safe/valid 假设
代码还需要检查 pid 是否为 -1 并适当地处理该错误。
当 child 进程完成时,它不应处于 while()
循环中,而是使用 exit()
函数退出。
parent 不应该直接退出,因为这会使两个 child 进程成为僵尸。 (僵尸很难在系统重启后摆脱。)
相反,parent 应该调用 wait()
或更好的 waitpid()
(记住 child 进程需要实际退出,而不是坐在 while()
循环。
1) func()
和 func2()
应该检查参数以确保它是正在处理的正确信号。
2) signal()
的手册页表明不应使用它。手册页建议使用:sigaction()
、
我需要 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;
}
当您 fork
时,您会得到新的 pid
。根据 kill manpage,您使用 pid
kill(pid_t pid, int sig);
您可以使用 popen() 函数通过分叉并打开到该进程的管道来打开该进程(而不是直接使用 fork())
parent 知道每个进程的 PID,因此可以轻松地将第二个 child 的 pid 传递给第一个 child。
第一个 child 可以使用 pid 和 kill()` 函数将信号传递给第二个 child。
所以,使用 popen() 启动第一个 child。使用 fork() 启动第二个 child,然后通过使用 popen() 创建的流将 pid 从第二个 child 传递到第一个。
未正确处理调用 fork() 返回的 pid 值。
发布的代码假设调用 fork() 成功...这不是 safe/valid 假设
代码还需要检查 pid 是否为 -1 并适当地处理该错误。
当 child 进程完成时,它不应处于 while()
循环中,而是使用 exit()
函数退出。
parent 不应该直接退出,因为这会使两个 child 进程成为僵尸。 (僵尸很难在系统重启后摆脱。)
相反,parent 应该调用 wait()
或更好的 waitpid()
(记住 child 进程需要实际退出,而不是坐在 while()
循环。
1) func()
和 func2()
应该检查参数以确保它是正在处理的正确信号。
2) signal()
的手册页表明不应使用它。手册页建议使用:sigaction()
、