Прерывание заблокированного чтения
Моя программа проходит такой цикл:
...
while(1){
read(sockfd,buf,sizeof(buf));
...
}
Функция чтения блокирует ожидание ввода, которое происходит из сокета. Я хочу обработать SIGINT и в основном сказать ему, чтобы он остановил функцию чтения, если она читает, а затем вызвал произвольную функцию. Каков наилучший способ сделать это?
2 ответа
Решение
От read(2)
:
EINTR The call was interrupted by a signal before any data
was read; see signal(7).
Если вы измените свой код, чтобы он выглядел больше как:
cont = 1;
while (1 && cont) {
ret = read(sockfd, buf, sizeof(buf));
if (ret < 0 && errno == EINTR)
cont = arbitrary_function();
}
Это позволяет arbitrary_function()
решить, если read(2)
следует повторить или нет.
Обновить
Вам нужно обработать сигнал, чтобы получить EINTR
поведение от read(2)
:
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
#include<errno.h>
int interrupted;
void handle_int(num) {
interrupted = 1;
}
int main(void){
char buf[9001];
struct sigaction int_handler = {.sa_handler=handle_int};
sigaction(SIGINT,&int_handler,0);
while(!interrupted){
printf("interrupted: %d\n", interrupted);
if(read(0,buf,sizeof(buf))<0){
if(errno==EINTR){
puts("eintr");
}else{
printf("%d\n",errno);
}
puts(".");
}
}
puts("end");
return 0;
}
Дает вывод:
$ ./foo
interrupted: 0
hello
interrupted: 0
^Ceintr
.
end
Когда ваш процесс получает сигнал, read()
вернется и значение errno
будет установлен в EINTR
,