|
From: Bart V. A. <bva...@so...> - 2018-12-01 19:08:35
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=66a7a592c072c1dee1e9083a19afcc6c0c1b7e76 commit 66a7a592c072c1dee1e9083a19afcc6c0c1b7e76 Author: Bart Van Assche <bva...@ac...> Date: Fri Nov 30 20:49:27 2018 -0800 drd: Add fork test program Diff: --- .gitignore | 1 + drd/tests/Makefile.am | 1 + drd/tests/fork.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+) diff --git a/.gitignore b/.gitignore index e88e3b3..a17d631 100644 --- a/.gitignore +++ b/.gitignore @@ -320,6 +320,7 @@ /drd/tests/dlopen_lib.so /drd/tests/dlopen_main /drd/tests/drd_bitmap_test +/drd/tests/fork /drd/tests/fp_race /drd/tests/free_is_write /drd/tests/hg01_all_ok diff --git a/drd/tests/Makefile.am b/drd/tests/Makefile.am index d09ca5f..99dfefa 100644 --- a/drd/tests/Makefile.am +++ b/drd/tests/Makefile.am @@ -370,6 +370,7 @@ check_PROGRAMS = \ concurrent_close \ dlopen_main \ dlopen_lib.so \ + fork \ fp_race \ free_is_write \ hold_lock \ diff --git a/drd/tests/fork.c b/drd/tests/fork.c new file mode 100644 index 0000000..07aaf73 --- /dev/null +++ b/drd/tests/fork.c @@ -0,0 +1,45 @@ +#include <stdio.h> +#include <pthread.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +static pthread_t tid[2]; + +static void *startproc(void *arg) +{ + pid_t pid; + char *argv[] = { "/bin/ls", "/bin/ls", NULL }; + + if ((pid = fork()) == -1) { + perror("fork error"); + } else if (pid == 0) { + dup2(2, 1); // redirect stdout to stderr + execv(argv[0], argv); // child + } + + return NULL; +} + +int main(int argc, char **argv) +{ + // No arguments means serialize the fork() calls. One argument means perform + // both fork() calls concurrently. + int serialize_fork = argc == 1; + int i = 0; + int err; + + for (i = 0; i < 2; i++) { + err = pthread_create(&tid[i], NULL, &startproc, NULL); + if (err != 0) + perror("pthread_create()"); + if (serialize_fork) + pthread_join(tid[i], NULL); + } + if (!serialize_fork) { + for (i = 0; i < 2; i++) + if (tid[i]) + pthread_join(tid[i], NULL); + } + return 0; +} |