SA_RESTART
вызывает перезапуск системных прерываний EINTR
(например, read
) после доставки обработанного сигнала.
Так что если у вас было:
#include <unistd.h>
#include <signal.h>
#include <errno.h>
void handler(int signal)
{
printf("Handler called\n");
}
int main()
{
struct sigaction act;
act.sa_handler = &handler;
act.sa_flags = 0;
if (sigaction(SIGINT, &act, NULL) < 0){ exit(1); }
char ch; ssize_t nr;
nr=read(0,&ch,1);
}
тогда с SA_RESTART
это будет выглядеть так, как если бы строка nr=read(0,&ch,1);
была заменена на
while(0>(nr=read(0,&ch,1)) && errno==EINTR){}`
. Обратите внимание, что в обработчиках сигналов следует вызывать только асин c -сигнал-безопасные функции. printf
в обработчике обычно является рецептом неопределенного поведения, хотя в данном конкретном случае, когда вы только прерываете код, который сам по себе является асинхронным c -signal-safe (read
), он довольно безопасен, хотя POSIX явно не санкционирует это (AFAIK).