Как я могу отправить сигнал между дочерним и родительским процессами в Linux - PullRequest
0 голосов
/ 24 октября 2018

У меня есть две трески, первая для родителя, который посылает ребенку сигнал (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);
    }
}

Дочерний код

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

void sighand1(int);
int main()
{
    FILE *fp1;
    int pid;
    fp1 = fopen("cpid.txt", "r");
    fscanf(fp1, "%d,", &pid);

    sigset(SIGUSR1,sighand1);

    while(1) {
        printf("Waiting..");
        sigpause(SIGUSR1);
    }

    return 0;
}

void sighand1(int the_sig)
{
    if (the_sig == SIGUSR1){
        printf("sigusr1 received");
        exit(1);
    }
}

Когда я запускаю код, он печатает, что процесс (дочерний) был создан, тогда, когда я посылаю ему сигналне будет делать то, что ребенок застрял в цикле или ожидании, а родитель ничего не сделает, кто-нибудь может сказать мне, где я ошибся в своем коде или логике.

1 Ответ

0 голосов
/ 24 октября 2018

В вашем коде есть несколько проблем:

  • Вы пытаетесь пропустить некоторый pid через файл, но вы можете использовать функцию getppid() (получить идентификатор родителя)
  • У вас естьнекоторый дочерний код, но он не называется
  • сигнал не запускается

Таким образом, ваш код можно исправить следующим образом:

#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;
}  
...