From: Eric W. Biederman > Sent: 12 June 2019 13:56 > David Laight <David.Laight@xxxxxxxxxx> writes: > > > From: David Laight > >> Sent: 11 June 2019 10:52 > > ... > >> If I have an application that has a loop with a pselect call that > >> enables SIGINT (without a handler) and, for whatever reason, > >> one of the fd is always 'ready' then I'd expect a SIGINT > >> (from ^C) to terminate the program. > >> > >> A quick test program: > >> > >> #include <sys/time.h> > >> #include <sys/types.h> > >> #include <unistd.h> > >> > >> #include <sys/select.h> > >> #include <signal.h> > >> > >> int main(int argc, char **argv) > >> { > >> fd_set readfds; > >> sigset_t sig_int; > >> struct timespec delay = {1, 0}; > >> > >> sigfillset(&sig_int); > >> sigdelset(&sig_int, SIGINT); > >> > >> sighold(SIGINT); > >> > >> for (;;) { > >> FD_ZERO(&readfds); > >> FD_SET(0, &readfds); > >> pselect(1, &readfds, NULL, NULL, &delay, &sig_int); > >> > >> poll(0,0,1000); > >> } > >> } > >> > >> Run under strace to see what is happening and send SIGINT from a different terminal. > >> The program sleeps for a second in each of the pselect() and poll() calls. > >> Send a SIGINT and in terminates after pselect() returns ERESTARTNOHAND. > >> > >> Run again, this time press enter - making fd 0 readable. > >> pselect() returns 1, but the program still exits. > >> (Tested on a 5.1.0-rc5 kernel.) > >> > >> If a signal handler were defined it should be called instead. > > > > If I add a signal handler for SIGINT it is called when pselect() > > returns regardless of the return value. > > That is odd. Is this with Oleg's fix applied? No it is a 5.1.0-rc5 kernel with no related local patches. So it is the 'historic' behaviour of pselect(). But not the original one! Under 2.6.22-5-31 the signal handler isn't caller when pselect() returns 1. David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)