Отправить сигнал от родителя пользовательскому процессу - PullRequest
0 голосов
/ 22 марта 2020

Я разветвляю процесс и назначаю дочерний процесс al oop, где каждую секунду мы увеличиваем таймер и отправляем сообщение на stderr. Когда таймер достигает 10, родитель должен сказать ребенку остановиться, отправив ему сигнал SIGUSR1. Это единственный способ сделать это. Моя проблема в том, что я не могу понять, как это сделать. Вот что я попробовал:

#define _XOPEN_SOURCE 700

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

volatile sig_atomic_t timer;

int task_execute(void (*function)());
void traite();

void sighandler(int sig)
{
        if (sig == SIGUSR1)
        {
                printf("Received SIGUSR1!\n");
                exit(127);
        }
}

int main()
{
        task_execute(&traite);
        return EXIT_FAILURE;
}
void traite()
{
        fprintf(stdout, "Message\n");
        timer++;
}

int task_execute(void (*function)())
{
        int result;
        pid_t p = fork();
        switch (p)
        {
        case -1:
                perror("fork");
                fprintf(stderr, "INIT %d\n", p);
                fprintf(stderr, "DEAD %d\n", p);
                break;
        case 0:
                signal(SIGUSR1, sighandler);
                while (1)
                {
                        function();
                        sleep(1);
                };

                exit(127);
                break;
        default:
                fprintf(stderr, "INIT %d\n", p);
                while (1)
                {
                        if (timer == 10)
                        {
                                break;
                        }
                }
                pid_t pid = wait(&result);

                if (WIFEXITED(result) && WEXITSTATUS(result) == EXIT_SUCCESS)
                {
                        fprintf(stderr, "FINI %d\n", pid);
                        kill(pid, SIGUSR1);
                        break;
                }
        }
}

Как я могу сказать, чтобы дочерний процесс остановился?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...