Mein Programm durchläuft eine Schleife wie diese:
...
while(1){
read(sockfd,buf,sizeof(buf));
...
}
Die Lesefunktion blockiert, wenn sie auf eine Eingabe wartet, die zufällig von einem Socket stammt. Ich möchte mit SIGINT umgehen und es im Grunde anweisen, die Lesefunktion zu stoppen, wenn es liest, und dann eine beliebige Funktion aufzurufen. Was ist der beste Weg, dies zu tun?
Aus read(2)
:
EINTR The call was interrupted by a signal before any data
was read; see signal(7).
Wenn Sie Ihren Code so ändern, dass er eher so aussieht:
cont = 1;
while (1 && cont) {
ret = read(sockfd, buf, sizeof(buf));
if (ret < 0 && errno == EINTR)
cont = arbitrary_function();
}
Dies lässt arbitrary_function()
entscheiden, ob die read(2)
erneut versucht werden soll oder nicht.
Aktualisieren
Sie müssen das Signal verarbeiten, um das zu erhalten EINTR
Verhalten ab read(2)
:
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
#include<errno.h>
int interrupted;
void handle_int(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;
}
Gibt Ausgabe:
$ ./foo
interrupted: 0
hello
interrupted: 0
^Ceintr
.
end
Wenn Ihr Prozess ein Signal empfängt, read()
wird zurückkehren und der Wert von errno
wird eingestellt EINTR
.