#include <sys/types.h>
#include <sys/wait.h>
+#include <sys/select.h>
#include <unistd.h>
#define PY_SSIZE_T_CLEAN
PyObject *rc = 0;
struct sigaction sa, oldsa;
sigset_t mask, oldmask;
+ fd_set infd;
int rstrchld = 0;
int fd, sfd;
int kid, st;
* like this happens, then we go back and try reaping children again.
*/
Py_BEGIN_ALLOW_THREADS
- n = read(sigfd, &ch, 1);
+ for (;;) {
+ n = read(sigfd, &ch, 1); if (n >= 0 || errno != EAGAIN) break;
+ FD_ZERO(&infd); FD_SET(sigfd, &infd);
+ n = select(sigfd + 1, &infd, 0, 0, 0); if (n < 0) break;
+ }
Py_END_ALLOW_THREADS
if (n == 1) rc = Py_BuildValue("(cOO)", ch, Py_None, Py_None);
else if (!n) rc = Py_BuildValue("(sOO)", "", Py_None, Py_None);