📜  门| GATE-CS-2017(套装1)|第 41 题(1)

📅  最后修改于: 2023-12-03 14:58:31.904000             🧑  作者: Mango

门 | GATE-CS-2017(套装1)|第 41 题

这道题目要求我们理解信号处理的相关概念以及实现,具体来说就是给定两个进程,P1和P2,P1每隔1s向P2发送一个信号(SIGUSR1),P2接收到信号后会将自己的pid打印出来,并继续等待下一个信号。

我们需要编写两个程序来分别实现这两个进程,下面是代码实现。

P1进程
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<signal.h>

void sig_handler(int signum)
{
    // do nothing
}

int main()
{
    pid_t p2_pid;

    signal(SIGUSR1, sig_handler);

    p2_pid = fork();

    if(p2_pid == 0)
    {
        // child process
        execl("./p2", "p2", NULL);
    }
    else if(p2_pid > 0)
    {
        // parent process
        while(1)
        {
            sleep(1);
            kill(p2_pid, SIGUSR1);
        }
    }
    else
    {
        printf("Error: Failed to create child process.\n");
    }

    return 0;
}

在P1进程中,我们首先定义了一个信号处理函数sig_handler,该函数会在P2进程接收到信号时被调用,我们在这里没有做任何处理,只是为了保证信号的正常传递。

在main函数中,我们使用fork函数创建了P2进程的子进程,并通过execl函数将其替换成p2可执行文件。同时,父进程不断地向P2进程发送信号(SIGUSR1)。

P2进程
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>

void sig_handler(int signum)
{
    printf("P2 pid: %d\n", getpid());
}

int main()
{
    signal(SIGUSR1, sig_handler);

    while(1)
    {
        sleep(1);
    }

    return 0;
}

在P2进程中,我们同样定义了一个信号处理函数sig_handler,该函数会在接收到P1进程发送的信号(SIGUSR1)时被调用,我们在这里打印出P2进程的pid。

在main函数中,我们不断地循环等待信号的到来。

至此,我们完成了信号处理的实现。