Иногда полезной практикой является отправка процессом сигнала самому себе. Эту задачу выполняет функция стандартной библиотеки (libc) raise():
#include <signal.h>
int raise(int sig);
В программе с одним потоком, вызов raise() аналогичен:
kill(getpid(), sig);
В приложениях с несколькими потоками, вызов raise() аналогичен:
pthread_kill(pthread_self(), sig);
Такая реализация означает, что сигнал будет доставлен ТОЛЬКО в тот поток, из которого был выполнен raise(). Вызов kill(getpid(), sig) посылает сигнал в вызывающий процесс => сигнал может быть доставлен в любой его поток.
Приведу небольшой пример для демонстрации работы функции (вызов signal() и механизм перехвата объясняются вот тут):
#include <signal.h>
#include <stdio.h>
void handler(int sig) {
printf("Signal received : %d\n", sig);
}
int main() {
signal(SIGILL, handler);
printf("Signal sent : %d\n", SIGILL);
raise(SIGILL);
return 0;
}
Выполним программу и получим:
$ ./prog
Signal sent : 4
Signal received : 4
Возвращаемое значение
Обратите внимание, что функция raise() возвращает ненулевой результат (не обязательно –1) при возникновении ошибки. Единственная проблема, которая может тут возникнуть — EINVAL (неверное значение sig).
LinuxCamp