On Fri, Aug 17, 2007 at 11:41:20AM -0400, John Blackwood wrote: > Hi Neil, > > We've been having problems with this select patch change. > > Specifically -- previously, when a ptrace attach was done to a task > blocked in a select() call and that task had a timeout value, > the task would restart the select() call with an updated timeout value. > > With this patch in place, the task now instead returns EINTR. > > A test that shows this issue is provided below. > > We also confirmed that attaching to a program sitting > in select() with gdb makes the select get an EINTR, so this > behavior also shows up in gdb. > > Thank you for your considerations in this matter. > I'm on vacation at the moment, but will look at this more closely when I get back on tuesday Regards Neil > ------------------- ------------------- > #include <stdio.h> > #include <sys/time.h> > #include <sys/types.h> > #include <unistd.h> > #include <errno.h> > #include <stdlib.h> > #include <string.h> > #include <ctype.h> > #include <time.h> > #include <signal.h> > #include <sys/wait.h> > #include <sys/ptrace.h> > > int > main(int argc, char ** argv) { > pid_t kid; > if ((kid = fork()) == 0) { > int ms_wait = 2000; > int rval; > struct timeval timeout; > > timeout.tv_sec = ms_wait / 1000; > timeout.tv_usec = (ms_wait % 1000) * 1000; > rval = select(0, NULL, NULL, NULL, &timeout); > if (rval == -1) { > int errcode = errno; > printf("Hey! Why did my select error off with errno %d (%s)?\n", > errcode, strerror(errcode)); > fflush(stdout); > } else { > printf("select call completed, return value: %d\n", rval); > } > exit(0); > } else if (kid == (pid_t)-1) { > perror("fork"); > } else { > int ms_wait = 500; > int rval; > struct timeval timeout; > > /* Wait a bit to make sure kid has a chance to get into its > * select call > */ > timeout.tv_sec = ms_wait / 1000; > timeout.tv_usec = (ms_wait % 1000) * 1000; > rval = select(0, NULL, NULL, NULL, &timeout); > > /* Now attach to the kid, then continue him. > */ > if (ptrace(PTRACE_ATTACH, kid, (void *)0, (void *)0) != 0) { > perror("ptrace"); > } > if (waitpid(kid, &rval, 0) != kid) { > perror("waitpid"); > } > if (ptrace(PTRACE_CONT, kid, (void *)0, (void *)0) != 0) { > perror("ptrace"); > } > if (waitpid(kid, &rval, 0) != kid) { > perror("waitpid"); > } > } > return 0; > } -- /*************************************************** *Neil Horman *Software Engineer *Red Hat, Inc. *nhorman@xxxxxxxxxxxxx *gpg keyid: 1024D / 0x92A74FA1 *http://pgp.mit.edu ***************************************************/ - To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html