diff options
Diffstat (limited to 'libaio-0.3.109/harness/cases/12.t')
-rw-r--r-- | libaio-0.3.109/harness/cases/12.t | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/libaio-0.3.109/harness/cases/12.t b/libaio-0.3.109/harness/cases/12.t new file mode 100644 index 0000000..e87d1dc --- /dev/null +++ b/libaio-0.3.109/harness/cases/12.t @@ -0,0 +1,53 @@ +/* 12.t +- ioctx access across fork() (12.t) + */ +#include <sys/types.h> +#include <sys/wait.h> +#include <unistd.h> +#include <signal.h> + +#include "aio_setup.h" + +void test_child(void) +{ + int res; + res = attempt_io_submit(io_ctx, 0, NULL, -EINVAL); + fflush(stdout); + _exit(res); +} + +int test_main(void) +{ + int res, status; + pid_t pid; + sigset_t set; + + if (attempt_io_submit(io_ctx, 0, NULL, 0)) + return 1; + + sigemptyset(&set); + sigaddset(&set, SIGCHLD); + sigprocmask(SIG_BLOCK, &set, NULL); + + fflush(NULL); + pid = fork(); assert(pid != -1); + + if (pid == 0) + test_child(); + + res = waitpid(pid, &status, 0); + + if (WIFEXITED(status)) { + int failed = (WEXITSTATUS(status) != 0); + printf("child exited with status %d%s\n", WEXITSTATUS(status), + failed ? " -- FAILED" : ""); + return failed; + } + + /* anything else: failed */ + if (WIFSIGNALED(status)) + printf("child killed by signal %d -- FAILED.\n", + WTERMSIG(status)); + + return 1; +} |