С APUE :
Чтобы приложениям не приходилось обрабатывать прерванные системные вызовы, 4.2BSD ввел автоматический перезапуск некоторых прерванных системных вызовов. Системные вызовы, которые были автоматически перезапущены: ioctl
, read
, readv
, write
, writev
, wait
и waitpid
.Как мы уже упоминали, первые пять из этих функций прерываются сигналом, только если они работают на медленном устройстве;wait
и waitpid
всегда прерываются при перехвате сигнала. Так как это вызывало проблему для некоторых приложений, которые не хотели, чтобы операция была перезапущена, если она была прервана, 4.3BSD позволила процессу отключитьэта функция для каждого сигнала.
Означает ли это, что до того, как был введен автоматический перезапуск , если процесс перехватил сигнал, wait
и waitpid
немедленноостановить ожидание и выполнить следующий код?
Например:
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
void handler(int sig){}
void handler2(int sig){}
int main(){
pid_t pid;
int status;
signal(SIGUSR1, handler);
signal(SIGUSR2, handler2);
if((pid == fork()) < 0){
printf("fork error\n");
}else{
if(pid){
//child
//do something, needs several hours.
}else{
//parent
waitpid(pid, &status, 0);
printf("Hello world\n");
}
}
return 0;
}
Если не обеспечен автоматический перезапуск , когда я запускаю эту программу в фоновом режиме gcc test.c && ./a.out &
,затем я посылаю сигнал kill -SIGUSR1 pid
или kill -SIGUSR2 pid
, waitpid
вернется и код после waitpid(pid, &status, 0);
будет выполнен.
И если при обеспечении автоматический перезапуск , waitpid
будетвыполнить снова, и родитель будет ждать.
Правильно ли мое понимание?