1
1
openmpi/test/runtime/sigchld.c
Brian Barrett de128a69fb Skip test when on old LinuxThreads machines and using progress threads
since you can't fork() in one thread and waitpid() on the child in another,
which is what this test expects you to do.  If Linux would just implement
the stupid POSIX standard already, this wouldn't be a problem.

This commit was SVN r5482.
2005-04-21 19:33:18 +00:00

94 строки
2.3 KiB
C

/*
* Copyright (c) 2004-2005 The Trustees of Indiana University.
* All rights reserved.
* Copyright (c) 2004-2005 The Trustees of the University of Tennessee.
* All rights reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "ompi_config.h"
#include "mpi.h"
#include "runtime/orte_wait.h"
#include "runtime/ompi_progress.h"
#include "runtime/runtime.h"
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <stdio.h>
#include <stdlib.h>
int count = 0;
static void callback(pid_t pid, int status, void *data)
{
printf("callback for %d, %d\n", pid, status);
count--;
}
int main(int argc, char *argv[])
{
pid_t pid, ret;
int status = -1;
#if OMPI_ENABLE_PROGRESS_THREADS && OMPI_THREADS_HAVE_DIFFERENT_PIDS
printf("test not properly configured when threads have different pids\n");
return 77;
#endif
orte_init();
pid = fork();
if (pid > 0) {
count++;
printf("parent launched child #1 PID %d\n", pid);
orte_wait_cb(pid, callback, NULL);
} else {
printf("child pid %d sleeping 10 seconds\n", getpid());
sleep(10);
printf("pid %d exiting after sleeping 10 seconds\n", getpid());
exit(0);
}
pid = fork();
if (pid > 0) {
printf("parent launched child #2 PID %d\n", pid);
ret = orte_waitpid(pid, &status, 0);
printf("pid %d waitpid, status %d\n", ret, status);
} else {
printf("child pid %d sleeping 5 seconds\n", getpid());
sleep(5);
printf("pid %d exiting after sleeping 5 seconds\n", getpid());
exit(0);
}
pid = fork();
if (pid > 0) {
count++;
printf("parent launched child #3 PID %d\n", pid);
orte_wait_cb(pid, callback, NULL);
} else {
printf("pid %d exiting after not sleeping at all\n", getpid());
exit(0);
}
while (count > 0) {
ompi_progress();
}
orte_finalize();
return 0;
}