[linux] обработка сигналов после exec

Landstreicher

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

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main
{
int fd = open("/somedir", 0, O_RDONLY);
fcntl(fd, F_SETSIG, 32 + 9);
fcntl(fd, F_NOTIFY, DN_ACCESS|DN_MODIFY|DN_CREATE|DN_DELETE|DN_RENAME|DN_ATTRIB|DN_MULTISHOT);
char* const args[] = { "sleep", "10", 0 };
execve("/bin/sleep", args, 0);
return 0;
}
если во время работы sleep сказать в соседней консоли touch /somedir/somefile то sleep вываливается:

nanosleep({10, 0}, 0) = ? ERESTART_RESTARTBLOCK (To be restarted)
--- SIGRT_9 (Real-time signal 8) @ 0 (0) ---
+++ killed by SIGRT_9 +++
Это баг? Или это умышленно так сделано (и зачем тогда)?

Marinavo_0507

Скорее всего специально.
Если ты заказываешь сигнал, то, наверное, хочешь его получить, разве не логично?

Landstreicher

Тебе не кажется что это очень странное поведение? Это уже совсем другой процесс, со другой логикой, с другим адресными пространством итп. Почему он должен ловить сигналы от предыдущего процесса?

Marinavo_0507

> Почему он должен ловить сигналы от предыдущего процесса?
Ну раз уж ему оставили файловый дескриптор, почему бы и не ловить?

Papazyan

Почему с другим адресным пространством? Все тоже самое. Другое дело, что обработчик сигнала могут затереть, тогда будет жопа.

sergey_m

Что значит "могут затереть"? Скажи, как их можно не затереть при exec?

amkharchenko

Ну, во-первых, если уж на то пошло, exec сохраняет статус SIG_IGN и SIG_DFL (в случае custom-обработчика переустанавливается на default значение --- НЕ В СМЫСЛЕ SIG_DFL). Это собственно про переустановку сигналов.
Ну, а вообще, по default по всем RT сигналам процесс умирает, так что не очень прямо скажем хорошо получается, но --- нефиг дескрипторы оставлять открытые. FD_CLOEXEC. Достаточно логично, что раз дескрипторы есть и, как надо думать, все fcntl флаги остаются, то и сигналы будут присылаться. It's not a bug, it's the only reasonable behaviour.
Оставить комментарий
Имя или ник:
Комментарий: