我需要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;
}
答案 0 :(得分:0)
当您fork
获得新的pid
时。根据{{3}},使用kill(pid_t pid, int sig);
pid
答案 1 :(得分:0)
你可以使用popen()函数通过分叉和打开到该进程的管道来打开一个进程(而不是直接使用fork())
父母知道每个过程的PID,因此可以轻松地将第二个孩子的pid传递给第一个孩子。
第一个孩子可以使用pid和kill()`函数将信号传递给第二个孩子。
所以,使用popen()来启动第一个孩子。使用fork()启动第二个子节点,然后通过popen()创建的流将pid从第二个子节点传递给第一个子节点。
没有正确处理从fork()调用返回的pid值的处理。
发布的代码假设对fork()的调用成功...这不是一个安全/有效的假设
代码还需要检查pid是否为-1并正确处理该错误。
当子进程完成时,它不应该位于while()
循环中,而是使用exit()
函数退出。
父母不应该退出,因为这会将两个子进程留作僵尸。 (僵尸很难摆脱系统重启。)
相反,父母应该调用wait()
或更好waitpid()
(并记住子进程需要实际退出,而不是坐在while()
循环中。
1)func()
和func2()
应检查参数以确保它是正在处理的正确信号。
2)signal()
的手册页表示不应该使用它。手册页建议使用:sigaction()
,