fork和signal:如何从父进程向特定的子进程发送信号

时间:2017-01-09 13:43:51

标签: c linux signals fork kill

我需要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;
}

2 个答案:

答案 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()

相关问题