我需要fork两个子进程。 一个可以接收信号3,打印hello并将信号4发送到另一个子进程; 另一个可以接收信号4,打印world并将信号3发送到第一个子进程。
首先,父进程将在睡眠3秒钟后将信号3发送到第一个子进程。
然后3秒后,父进程将发送SIGKILL杀死他们两个。
我不知道如何向特定的子进程发送信号(我知道我们有一个函数kill来发送信号,但是我不知道在这里使用它)。
这是我的代码:
#include
#include
#include
#include
#include
void func(int n)
{
printf("ping
");
// how to send signal 4 to the second process?
}
void func2(int n)
{
printf("pong
");
// 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;
}
在信号上下文中调用printf()的未定义行为。
man7.org/linux/man-pages/man2/kill.2.html
@EOF那我该怎么办?
@alk但是我仍然不知道如何向子进程发送信号。
您需要kill()系统调用。 棘手的部分是,您必须以某种方式告诉每个孩子其兄弟姐妹的PID。 父母可能通过在管道上写信息来告诉他们两个吗? 或者,也许您使用过程组来进行信号发送。
@JonathanLeffler是的,实际上这是我不知道该怎么做。 也许您是对的,我必须使用管道或共享内存。
@ user3629249非常感谢。 如果您愿意,您可以回答这个问题,我会接受您的回答。
将我的评论移至答案。
您可以使用popen()函数通过分叉并打开该进程的管道来打开该进程(而不是直接使用fork())
父级知道每个进程的PID,因此可以轻松地将第二个孩子的pid传递给第一个孩子。
第一个孩子可以使用pid和kill()函数将信号传递给第二个孩子。
因此,使用popen()启动第一个孩子。使用fork()启动第二个孩子,然后通过popen()创建的流将pid从第二个孩子传递到第一个孩子。
从fork()调用返回的pid值的处理未正确处理。
发布的代码假设对fork()的调用已成功...这不是一个安全/有效的假设
该代码还需要检查pid是否为-1并适当地处理该错误。
当子进程完成时,它不应使用exit()函数位于while()循环中,而应退出。
父进程不应仅退出,因为这会使两个子进程成为僵尸。 (如果不重新启动系统,僵尸很难摆脱。)
相反,父级应该调用wait()甚至更好的waitpid()(并记住子进程需要实际退出,而不是坐在while()循环中。
1)func()和func2()应该检查参数以确保它是正在处理的正确信号。
2)signal()的手册页指示不应使用它。手册页建议使用:sigaction(),
fork时,您将获得新的pid。根据杀死手册,您使用pid调用kill(pid_t pid, int sig);
如果我在第一个sleep(3)之后写kill(pid, 3),我认为它将发送给所有子进程。 我需要发送到第一个子进程。
@托马斯:不; 除非您为pid使用零或负值,否则它将信号发送到一个进程。
好。 我知道了。 我还有另一个问题:如何在进程之间共享pid? 因为我需要func中的kill(4, secondProcessPid)和func2中的kill(3, firstProcessPid)。 如何获得这两个PID? 我必须使用共享内存之类的东西吗?
您有向后kill的参数。...在这种情况下,共享内存似乎是多余的。 当您fork()时,子进程是父进程的副本。 这包括全局变量和局部变量。