blob: dd83a6922d06a12e4b1966e56bc3fd0851c4bd6a [file] [log] [blame]
Denys Vlasenko26de70e2009-02-13 10:26:31 +00001/* This test is not yet added to Makefile */
2
Denys Vlasenko8ed57272009-02-25 14:24:02 +00003#include <stdlib.h>
Denys Vlasenko26de70e2009-02-13 10:26:31 +00004#include <stddef.h>
5#include <unistd.h>
6#include <signal.h>
7
8#include <sys/types.h>
9#include <sys/socket.h>
Denys Vlasenko8ed57272009-02-25 14:24:02 +000010
Denys Vlasenko26de70e2009-02-13 10:26:31 +000011static const struct sockaddr sa;
12
Denys Vlasenko8ed57272009-02-25 14:24:02 +000013int main(int argc, char *argv[])
Denys Vlasenko26de70e2009-02-13 10:26:31 +000014{
15 int loops;
16 int pid;
17 sigset_t set;
18
19 sigemptyset(&set);
20 sigaddset(&set, SIGCHLD);
21 sigprocmask(SIG_BLOCK, &set, NULL);
22
23 loops = 999;
24 if (argv[1])
25 loops = atoi(argv[1]);
26
27 while (--loops >= 0) {
28 pid = fork();
Denys Vlasenko8ed57272009-02-25 14:24:02 +000029
30 if (pid < 0)
31 exit(1);
32
Denys Vlasenko26de70e2009-02-13 10:26:31 +000033 if (!pid) {
34 /* child */
35 int child = getpid();
36
37 loops = 99;
38 while (--loops) {
39 pid = fork();
Denys Vlasenko8ed57272009-02-25 14:24:02 +000040
41 if (pid < 0)
42 exit(1);
43
Denys Vlasenko26de70e2009-02-13 10:26:31 +000044 if (!pid) {
45 /* grandchild: kill child */
46 kill(child, SIGKILL);
Denys Vlasenko8ed57272009-02-25 14:24:02 +000047 exit(0);
Denys Vlasenko26de70e2009-02-13 10:26:31 +000048 }
Denys Vlasenko8ed57272009-02-25 14:24:02 +000049
Denys Vlasenko26de70e2009-02-13 10:26:31 +000050 /* Add various syscalls you want to test here.
51 * strace will decode them and suddenly find
52 * process disappearing.
53 * But leave at least one case "empty", so that
54 * "kill grandchild" happens quicker.
55 * This produces cases when strace can't even
56 * decode syscall number before process dies.
57 */
58 switch (loops & 1) {
Denys Vlasenko8ed57272009-02-25 14:24:02 +000059 case 0:
60 break; /* intentional empty */
61 case 1:
62 sendto(-1, "Hello cruel world", 17, 0, &sa, sizeof(sa));
63 break;
Denys Vlasenko26de70e2009-02-13 10:26:31 +000064 }
Denys Vlasenko8ed57272009-02-25 14:24:02 +000065
Denys Vlasenko26de70e2009-02-13 10:26:31 +000066 /* kill grandchild */
67 kill(pid, SIGKILL);
68 }
Denys Vlasenko8ed57272009-02-25 14:24:02 +000069
70 exit(0);
Denys Vlasenko26de70e2009-02-13 10:26:31 +000071 }
Denys Vlasenko8ed57272009-02-25 14:24:02 +000072
Denys Vlasenko26de70e2009-02-13 10:26:31 +000073 /* parent */
74 wait(NULL);
75 }
Denys Vlasenko8ed57272009-02-25 14:24:02 +000076
Denys Vlasenko26de70e2009-02-13 10:26:31 +000077 return 0;
78}