#c #signals #ipc
#c #сигналы #ipc
Вопрос:
Я изучаю связь между двумя процессами, используя сигналы на C на GeeksforGeeks https://www.geeksforgeeks.org/signals-c-set-2/?ref=lbp . И я пытался запустить код, представленный на веб-сайте. Я просто копирую код в онлайн-компилятор C.
// C program to implement sighup(), sigint()
// and sigquit() signal functions
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
// function declaration
void sighup();
void sigint();
void sigquit();
// driver code
void main()
{
int pid;
/* get child process */
if ((pid = fork()) < 0) {
perror("fork");
exit(1);
}
if (pid == 0) { /* child */
signal(SIGHUP, sighup);
signal(SIGINT, sigint);
signal(SIGQUIT, sigquit);
for (;;)
; /* loop for ever */
}
else /* parent */
{ /* pid hold id of child */
printf("nPARENT: sending SIGHUPnn");
kill(pid, SIGHUP);
sleep(3); /* pause for 3 secs */
printf("nPARENT: sending SIGINTnn");
kill(pid, SIGINT);
sleep(3); /* pause for 3 secs */
printf("nPARENT: sending SIGQUITnn");
kill(pid, SIGQUIT);
sleep(3);
}
}
// sighup() function definition
void sighup()
{
signal(SIGHUP, sighup); /* reset signal */
printf("CHILD: I have received a SIGHUPn");
}
// sigint() function definition
void sigint()
{
signal(SIGINT, sigint); /* reset signal */
printf("CHILD: I have received a SIGINTn");
}
// sigquit() function definition
void sigquit()
{
printf("My DADDY has Killed me!!!n");
exit(0);
}
Однако все, что я получил, похоже на это
PARENT: sending SIGHUP
PARENT: sending SIGINT
PARENT: sending SIGQUIT
Мне интересно, это проблема с моим компьютером?
Комментарии:
1. Работает здесь, я не могу подтвердить какую-либо проблему (Ubuntu 20.04).
2. Я бы посоветовал попробовать запустить его в вашей системе и убедиться, что оба процесса существуют во время выполнения, я не думаю, что вам следует запускать несколько процессов в онлайн-компиляторе
3. Хотя ваш код не ошибочен,
sigaction()
обычно предпочтительнее в системах POSIXsignal()
, поскольку семантикаsigaction()
фактически переносима. Точное поведениеsignal()
варьируется от реализации к реализации.
Ответ №1:
В коде неверно предполагается, что дочерний процесс устанавливает обработчики до того, как родительский процесс отправит сигналы. Это может быть так, но это не гарантировано. Конечно, если обработчики не установлены, дочерний процесс немедленно уничтожается. Вы можете подтвердить это, проверив, что kill
возвращает -1
значение и errno
имеет значение ESRCH
.
Также имейте в виду, что printf
это небезопасно для сигнала.
Комментарии:
1. Спасибо. Тогда как я могу изменить код или где я должен искать, чтобы исправить это?
2. Пусть родительский процесс установит обработчики раньше
fork
. Они наследуются дочерним процессом.3. Что такое обработчики на самом деле
4. Функция, переданная
signal
, напримерvoid sighup
. Он обрабатывает входящий сигнал.
Ответ №2:
Не все онлайн-компиляторы / среды C созданы одинаково. Попробуйте repl.it , Я только что попробовал и получил точные результаты, опубликованные geeks4geeks.