Ниже приведено рабочее решение вашей проблемы.
#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», переключение контекста может произойти внезапно, и сообщение в дочернем процессе может быть напечатано. Поэтому, чтобы избежать этого, я жду, пока ребенок не перейдет в состояние СТОП. Когда ребенок находится в состоянии ОСТАНОВЛЕНО, родитель печатает «пинг» и возобновляет его, а ребенок печатает «понг».
Надеюсь, вы поняли мое объяснение ...