Rework the handling of the children for the pthread_vfork_test. The

trivial handler for SIGCHLD is installed, and SIGCHLD is blocked, to
not abandon our zombies to init(8). This way, the zombies are around
slightly longer, allowing to actually exercise the logic for p_pwait
use by the test.

MFC after:	1 week
This commit is contained in:
Konstantin Belousov 2013-01-30 13:14:34 +00:00
parent 538375d42e
commit 9005607c8f
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=246119

View File

@ -29,6 +29,8 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/types.h>
#include <sys/wait.h>
#include <err.h>
#include <pthread.h>
#include <signal.h>
@ -39,10 +41,11 @@ __FBSDID("$FreeBSD$");
#define NUM_THREADS 100
void *
vfork_test(void *threadid)
static void *
vfork_test(void *threadid __unused)
{
pid_t pid;
pid_t pid, wpid;
int status;
for (;;) {
pid = vfork();
@ -50,10 +53,20 @@ vfork_test(void *threadid)
_exit(0);
else if (pid == -1)
err(1, "Failed to vfork");
else {
wpid = waitpid(pid, &status, 0);
if (wpid == -1)
err(1, "waitpid");
}
}
return (NULL);
}
static void
sighandler(int signo __unused)
{
}
/*
* This program invokes multiple threads and each thread calls
* vfork() system call.
@ -63,19 +76,24 @@ main(void)
{
pthread_t threads[NUM_THREADS];
struct sigaction reapchildren;
sigset_t sigchld_mask;
int rc, t;
memset(&reapchildren, 0, sizeof(reapchildren));
reapchildren.sa_handler = SIG_IGN;
/* Automatically reap zombies. */
reapchildren.sa_handler = sighandler;
if (sigaction(SIGCHLD, &reapchildren, NULL) == -1)
err(1, "Could not sigaction(SIGCHLD)");
sigemptyset(&sigchld_mask);
sigaddset(&sigchld_mask, SIGCHLD);
if (sigprocmask(SIG_BLOCK, &sigchld_mask, NULL) == -1)
err(1, "sigprocmask");
for (t = 0; t < NUM_THREADS; t++) {
rc = pthread_create(&threads[t], NULL, vfork_test, (void *)t);
rc = pthread_create(&threads[t], NULL, vfork_test, &t);
if (rc)
errc(1, rc, "pthread_create");
}
pause();
return (0);
}