[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [OSSTEST PATCH] standalone-generate-dump-flight-runvars: Handle ^C properly
Ian Jackson writes ("[OSSTEST PATCH] standalone-generate-dump-flight-runvars: Handle ^C properly"): > This is all mad. ... > +# I _think_ that that any signal which arrives before the assignment > +# to $SIG{} will definitely have caused our parent to vanish and us to > +# be reparented to pid 1 by the time we do the getppid check. But TBH > +# I can't find any clear support for this requirement. So the result > +# may still be slightly racy in the case that s-g-d-f-r is ^C'd right > +# after starting. The test program below demonstrates that this assuption is not true. However, a better approach is likely to be absurdly complex, involving the parent shell having an INT trap which conducts an explicit rendezvous with ?each child. Ian. #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <assert.h> #include <sys/poll.h> #include <sys/types.h> #include <sys/wait.h> static pid_t willdie, child, parent; static void runtest(void) { willdie = getpid(); assert(willdie>=0); child = fork(); assert(child>=0); if (!child) { kill(willdie, SIGUSR1); parent = getppid(); // sleep(1); if (parent==1) _exit(0); fprintf(stderr,"willdie=%ld parent=%ld\n", (long)willdie,(long)parent); _exit(1); } for (;;) ; } int main(int argc, char **argv) { int st; for (;;) { willdie = fork(); assert(willdie>=0); if (!willdie) runtest(); pid_t got = waitpid(willdie, &st, 0); assert(got==willdie); assert(WIFSIGNALED(st) && WTERMSIG(st)==SIGUSR1); } } _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |