Как отправить сигнал от родителя к дочернему процессу, используя C? - PullRequest
1 голос
/ 19 марта 2020

Мне нужно написать «Пинг-понг» в командной строке с использованием Linux процессов в C (родительский вывод «Пинг» , его дочерний - »понг "), но я понятия не имею, как отправить сигнал от родителя к ребенку.

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void childSignalHandler(int signal) {
    puts("pong");
}

void parentSignalHandler(int signal) {
    puts("Ping ");
}

int main() {
    int pid = fork();
    if (pid < 0) {
        printf("error");
        return -1;
    }

    if (pid == 0) {
        signal(SIGUSR2, childSignalHandler);
    } else {
        signal(SIGUSR1, parentSignalHandler);
        raise(SIGUSR1);
    }
    return 0;
}

Ответы [ 2 ]

1 голос
/ 19 марта 2020

Ниже приведено рабочее решение вашей проблемы.

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


int main() {
    int pid = fork();
    if (pid < 0) {
        printf("error");
        return -1;
    }

    if (pid == 0) {
        raise(SIGSTOP); // Stopping the execution of child process
        printf(" Pong");
    } else {
        waitpid(pid, NULL, WUNTRACED); // Wait until the child execution is stopped
        printf("Ping"); 
        kill(pid, SIGCONT);  // resume child process
    }
    return 0;
}

Объяснение:

Когда мы используем fork, мы не можем предсказать, какой процесс будет выполняться первым , На основе алгоритма планирования может выполняться либо процесс PARENT, либо процесс CHILD.

В приведенном выше коде у нас есть два сценария ios:

Сценарий 1: Если дочерний процесс выполняется во-первых, я останавливаю / приостанавливаю дочернее выполнение, используя SIGSTOP. Поэтому, когда дочернее выполнение приостановлено, процесс PARENT будет запланирован и напечатает сообщение «Ping». После распечатки сообщения ping я даю ребенку сигнал возобновления / продолжения. Теперь дочерние элементы выводят «Pong»

Сценарий 2: Если родительский элемент выполняется первым, я заставляю родительского элемента ждать, пока дочерний процесс не будет остановлен. Поскольку до того, как родительский элемент напечатает «ping», переключение контекста может произойти внезапно, и сообщение в дочернем процессе может быть напечатано. Поэтому, чтобы избежать этого, я жду, пока ребенок не перейдет в состояние СТОП. Когда ребенок находится в состоянии ОСТАНОВЛЕНО, родитель печатает «пинг» и возобновляет его, а ребенок печатает «понг».

Надеюсь, вы поняли мое объяснение ...

1 голос
/ 19 марта 2020

Вы ищете трубы, по сути, они представляют собой одностороннюю связь между двумя процессами. Думайте о них как о виртуальном файле, который можно использовать для анализа информации.

Вот учебник, с которого можно начать

https://www.geeksforgeeks.org/pipe-system-call/

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