LINUX.ORG.RU

почему завершается процесс на сигнале SIGIO

 , , sigio


0

1

Есть два процесса - один родительский, второй дочерний. В дочернем стоит обработчик сигнала SIGIO, а в родительском нет. Когда я посылаю сигнал в дочерний - срабатывает обработчик и всё окей. Когда же я посылаю из дочернего:

__pid_t ppid = getppid();
int res = kill(ppid, SIGIO);
то родительский процесс завершается. Почему? Любой сигнал на который нет обработчика завершает процесс?

А зачем тогда функция sigwaitinfo? И прочие wait-ы? Вот как я жду в родительском процессе сигнала от дочернего:

sigset_t sset;
siginfo_t sinfo;
sigemptyset(&sset);
sigaddset(&sset, SIGIO);
int sig = sigwaitinfo(&sset, &sinfo);

Если я сделаю обработчик - то как сигнал будет попадать сюда?

В общем, вопрос: можно ли посылать (ну ясно что тут kill или sigqueue) и принимать сигналы без обработчиков? Допустим у меня есть поток - в нем я блокируюсь и жду спокойно любого сигнала от дочернего процесса...

Любой сигнал на который нет обработчика завершает процесс?

Реакция на сигналы по умолчанию записана в man 7 signal, для SIGIO - завершение процесса.

Если я сделаю обработчик - то как сигнал будет попадать сюда?

Отлично будет.

можно ли посылать (ну ясно что тут kill или sigqueue) и принимать сигналы без обработчиков?

Кажется, пустой обработчик всё же нужен.

unsigned ★★★★
()

Блокируй сигналы, которые ждёшь, через sigprocmask, тогда никаких дополнительных обработчиков не нужно.

NoMasters
()
Ответ на: комментарий от NoMasters
sigset_t sset;
sigemptyset(&sset);
sigaddset(&sset, SIGIO);
sigprocmask(SIG_BLOCK, &sset, NULL);

это привело к тому что родительский процесс не может теперь посылать SIGIO дочернему - не то что надо... пошел писать обработчик

какая-то путаница с этими сигналами, мне надо чтобы приход сигнала отслеживался внутри кода при помощи wait

I-Love-Microsoft ★★★★★
() автор топика
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от NoMasters

добавил я обработчик - теперь сигнал обрабатывается хэндлером, а на этом месте виснет ибо сигналы никакие не идут:

sigset_t sset;
siginfo_t sinfo;
sigemptyset(&sset);
sigaddset(&sset, SIGIO);
int sig = sigwaitinfo(&sset, &sinfo);
if(sig == SIGIO)
{
	qDebug() << "SIGIO from slave";
}

Вопрос: как сделать так чтобы процесс не завершался, но тем не менее ловил сигнал.

Странно же, да, sigwaitinfo придумали функцию, но сигнал без обработчика не доходит и завершает процесс... ЧЯДНТ?

Я могу сделать так чтобы этот хэндлер сам сообщал куда надо - но не будет ли это костыль, может есть фукнция ждать конкретного сигнала SIGIO от конкретного PID?

А может есть другие способы обменяться сигналом между процессами? Простые способы...

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

void handler(int sig)
{
	puts("signal received(handler)");
}

int main()
{
	int sig, child;
	sigset_t set; 
	sigemptyset(&set);
	sigaddset(&set, SIGIO); 
	sigprocmask(SIG_BLOCK, &set, NULL); 
	child = fork();
	switch(child)
	{
		case -1:
			break;
		case 0:
			signal(SIGIO, handler);
			sigprocmask(SIG_UNBLOCK, &set, NULL);
			kill(getppid(), SIGIO);
			break;
		default:
			kill(child, SIGIO);
			sigwait(&set, &sig);
			puts("signal received(sigwait)");
			wait(child);
			break;
	}
	return 0;
}

УМВР. Но вообще говоря, SIGIO нужен для вполне определённых ситуаций, слать не по делу его не стоит.

NoMasters
()
Ответ на: комментарий от NoMasters

мне исключительно в целях информирования других процессов о том что есть новые данные дабы избежать поллинга

я могу хоть zeromq использовать для этих целей, или даже D-Bus

но выбрал сигнал SIGIO

I-Love-Microsoft ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.