Bug #3329
closedWIFSIGNALED(x) should return false when child is continued by SIGCONT
100%
Description
The macro WIFSIGNALED(status)
gives true even when the child process is
continued by a signal SIGCONT. I think it should be true ONLY IF the
child is terminated by a signal, as described in wait(2) man page.
On DragonFly 6.2, an example C program (see the end of this post) gives:
0x117f: stopped 0x0013: signaled: 19 0x0013: continued 0x0000: exited: 0
The two lines with status=0x0013 shows that both WIFSIGNALED(status)
andWIFCONTINUED(status)
are true for this status.
On FreeBSD it gives:
0x117f: stopped 0x0013: continued 0x0000: exited: 0
The line 'signaled' is not output also on Linux and macOS.
On FreeBSD the macro is defined (in sys/wait.h) as follows:
#define WIFSIGNALED(x) (_WSTATUS(x) != _WSTOPPED && _WSTATUS(x) != 0 && (x) != 0x13)
I think DragonFly should use the same definition.
Jun
/*==== an example C program ======*/
#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <signal.h> pid_t child; int done = 0; void handler(int sig) { int status; while(waitpid(child, &status, WNOHANG|WUNTRACED|WCONTINUED) == child) { if (WIFEXITED(status)) { printf("0x%04x: exited: %d\n", status, WEXITSTATUS(status)); done = 1; } if (WIFSIGNALED(status)) printf("0x%04x: signaled: %d\n", status, WTERMSIG(status)); if (WIFCONTINUED(status)) printf("0x%04x: continued\n", status); if (WIFSTOPPED(status)) printf("0x%04x: stopped\n", status); } } int main(void) { signal(SIGCHLD, handler); if ((child = fork()) > 0) { kill(child, SIGSTOP); sleep(1); kill(child, SIGCONT); /* explicitly call handler() since we will not receive SIGCHLD */ handler(SIGCHLD); while(!done) { sleep(1); /* wait for child to exit */ } } else { /* child */ sleep(1); } return 0; }
Updated by liweitianux almost 2 years ago
- Category set to Kernel
- Status changed from New to In Progress
So I've searched the WIFSIGNALED(x)
macro in all BSDs,
and found OpenBSD and we don't exclude the SIGCONT
signal,
while FreeBSD and NetBSD do.
I'll update this macro later. Thanks.
Updated by liweitianux almost 2 years ago
- Status changed from In Progress to Resolved
- % Done changed from 0 to 100
Fixed in both master and 6.4 release branches. Thanks.