Project

General

Profile

Actions

Bug #3329

closed

WIFSIGNALED(x) should return false when child is continued by SIGCONT

Added by JunT over 1 year ago. Updated about 1 year ago.

Status:
Resolved
Priority:
Normal
Assignee:
-
Category:
Kernel
Target version:
Start date:
09/20/2022
Due date:
% Done:

100%

Estimated time:

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) and
WIFCONTINUED(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;
}

Actions #1

Updated by tuxillo over 1 year ago

  • Description updated (diff)
Actions #2

Updated by liweitianux about 1 year 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.

Actions #3

Updated by liweitianux about 1 year ago

  • Status changed from In Progress to Resolved
  • % Done changed from 0 to 100

Fixed in both master and 6.4 release branches. Thanks.

Actions

Also available in: Atom PDF