diff options
author | Ulrich Drepper <drepper@redhat.com> | 2006-08-01 06:40:11 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2006-08-01 06:40:11 +0000 |
commit | a1260d92a7e3c11e1db74ad7007332f87fc1b690 (patch) | |
tree | 0690bdd3500e1dcc2b72ad8cd35b2a69de74dc79 /nptl/tst-getpid3.c | |
parent | 13669f2c304545de194ec014255b5e3141615ac1 (diff) | |
download | glibc-a1260d92a7e3c11e1db74ad7007332f87fc1b690.zip glibc-a1260d92a7e3c11e1db74ad7007332f87fc1b690.tar.gz glibc-a1260d92a7e3c11e1db74ad7007332f87fc1b690.tar.bz2 |
* stdlib/test-canon.c (do_test): Close fd before unlinking file so
that directory is empty even on non-POSIX filesystems.
Diffstat (limited to 'nptl/tst-getpid3.c')
-rw-r--r-- | nptl/tst-getpid3.c | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/nptl/tst-getpid3.c b/nptl/tst-getpid3.c new file mode 100644 index 0000000..f1e77f6 --- /dev/null +++ b/nptl/tst-getpid3.c @@ -0,0 +1,114 @@ +#include <errno.h> +#include <pthread.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <sys/wait.h> + + +static pid_t pid; + +static void * +pid_thread (void *arg) +{ + if (pid != getpid ()) + { + printf ("pid wrong in thread: should be %d, is %d\n", + (int) pid, (int) getpid ()); + return (void *) 1L; + } + + return NULL; +} + +static int +do_test (void) +{ + pid = getpid (); + + pthread_t thr; + int ret = pthread_create (&thr, NULL, pid_thread, NULL); + if (ret) + { + printf ("pthread_create failed: %d\n", ret); + return 1; + } + + void *thr_ret; + ret = pthread_join (thr, &thr_ret); + if (ret) + { + printf ("pthread_create failed: %d\n", ret); + return 1; + } + else if (thr_ret) + { + printf ("thread getpid failed\n"); + return 1; + } + + pid_t child = fork (); + if (child == -1) + { + printf ("fork failed: %m\n"); + return 1; + } + else if (child == 0) + { + if (pid == getpid ()) + { + puts ("pid did not change after fork"); + exit (1); + } + + pid = getpid (); + ret = pthread_create (&thr, NULL, pid_thread, NULL); + if (ret) + { + printf ("pthread_create failed: %d\n", ret); + return 1; + } + + ret = pthread_join (thr, &thr_ret); + if (ret) + { + printf ("pthread_create failed: %d\n", ret); + return 1; + } + else if (thr_ret) + { + printf ("thread getpid failed\n"); + return 1; + } + + return 0; + } + + int status; + if (TEMP_FAILURE_RETRY (waitpid (child, &status, 0)) != child) + { + puts ("waitpid failed"); + kill (child, SIGKILL); + return 1; + } + + if (!WIFEXITED (status)) + { + if (WIFSIGNALED (status)) + printf ("died from signal %s\n", strsignal (WTERMSIG (status))); + else + puts ("did not terminate correctly"); + return 1; + } + if (WEXITSTATUS (status) != 0) + { + printf ("exit code %d\n", WEXITSTATUS (status)); + return 1; + } + + return 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" |