我如何在Linux中的子进程和父进程之间发送信号

时间:2018-10-24 08:04:48

标签: c linux ubuntu

我有两个鳕鱼,第一个是给父母的,它向孩子发送一个信号(update `guests` set `status`=$1 where `name`=$2'` ),当孩子收到它时,他应该打印他收到的信号。

父代码

SIGUSER1

子代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/types.h>

void sighand(int);
int main()
{
    int cpid, ppid;
    ppid = getpid();
    printf("My process ID is %d\n", ppid);

    FILE *fp1;
    fp1 = fopen("cpid.txt", "w+");

    cpid = fork();

    if ( cpid == 0 ) {
        printf("I am the child  => PID = %d\n", getpid());
    }
    else
        printf("I am the parent => PID = %d, child ID = %d\n", getpid(), cpid);

    fprintf(fp1, "%d\n", cpid);
    // kill(cpid, SIGUSR1);//id, signal, send
    sigset(SIGUSR2, sighand);

    return 0;
}  

void sighand(int the_sig){
    if (the_sig == SIGUSR2){
        printf("sigusr2 received");
        exit(1);
    }
}

当我启动代码时,它会打印出已创建了进程(子进程),然后在我发送信号时,它不会做任何事情使子进程陷入阻塞或等待,而父进程也不会做任何事情,任何人都可以告诉我在哪里我的代码或逻辑上出错了吗?

1 个答案:

答案 0 :(得分:1)

您的代码有几个问题:

  • 您尝试通过文件传递一些pid,但是可以使用getppid()函数(获取父ID)
  • 您有一些子代码,但未调用
  • 没有信号发出

因此,您可以通过以下方式更正您的代码:

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

void parent_handler(int the_sig)
{
    if (the_sig == SIGUSR2){
        printf("sigusr2 received in parent\n");            
    }
}

void child_handler(int the_sig)
{
    if (the_sig == SIGUSR1){
        printf("sigusr1 received in child\n");
        kill(getppid(), SIGUSR2);
        exit(1);
    }
}

int child_function()
{
    /* prepare to receive signal */
    sigset(SIGUSR1,child_handler);

    while(1) {
        printf("Waiting..");
        fflush(stdout);
        /* wait for signal */
        sigpause(SIGUSR1);
    }

    return 0;
}

int main()
{
    int cpid, ppid;
    ppid = getpid();
    printf("My process ID is %d\n", ppid);

    cpid = fork();

    if ( cpid == 0 ) {
        printf("I am the child  => PID = %d\n", getpid());
        child_function();
        return 0;
    }
    else
        printf("I am the parent => PID = %d, child ID = %d\n", getpid(), cpid);

    /* child will never reach this point */
    sleep(1);

    /* prepare parent to received signal */
    sigset(SIGUSR2, parent_handler);

    /* send signal to child */
    kill(cpid, SIGUSR1);

    sleep(1);

    return 0;
}