blob: 01b8986ef0e91c3afd9e921c61ec316c5c2466ba [file] [log] [blame]
Denys Vlasenko8ed57272009-02-25 14:24:02 +00001#include <stdlib.h>
Denys Vlasenko26de70e2009-02-13 10:26:31 +00002#include <stddef.h>
3#include <unistd.h>
4#include <signal.h>
Denys Vlasenko26de70e2009-02-13 10:26:31 +00005#include <sys/types.h>
6#include <sys/socket.h>
Denys Vlasenko8158e772011-06-08 14:08:59 +02007#include <stdio.h>
Denys Vlasenko8ed57272009-02-25 14:24:02 +00008
Denys Vlasenko26de70e2009-02-13 10:26:31 +00009static const struct sockaddr sa;
10
Denys Vlasenko8ed57272009-02-25 14:24:02 +000011int main(int argc, char *argv[])
Denys Vlasenko26de70e2009-02-13 10:26:31 +000012{
13 int loops;
14 int pid;
15 sigset_t set;
16
Denys Vlasenko8158e772011-06-08 14:08:59 +020017 printf(
18"Please run me under 'strace -f -oLOG', and examine LOG file for incorrect\n"
19"decoding of interrupted syscalls: grep for 'sendto', '??" /* anti-trigraph gap */ "?', 'unavailable'.\n"
20"Pass number of iterations in argv[1] (default: 999).\n"
21 );
22
Denys Vlasenko26de70e2009-02-13 10:26:31 +000023 sigemptyset(&set);
24 sigaddset(&set, SIGCHLD);
25 sigprocmask(SIG_BLOCK, &set, NULL);
26
27 loops = 999;
28 if (argv[1])
29 loops = atoi(argv[1]);
30
31 while (--loops >= 0) {
32 pid = fork();
Denys Vlasenko8ed57272009-02-25 14:24:02 +000033
34 if (pid < 0)
35 exit(1);
36
Denys Vlasenko26de70e2009-02-13 10:26:31 +000037 if (!pid) {
38 /* child */
39 int child = getpid();
40
41 loops = 99;
42 while (--loops) {
43 pid = fork();
Denys Vlasenko8ed57272009-02-25 14:24:02 +000044
45 if (pid < 0)
46 exit(1);
47
Denys Vlasenko26de70e2009-02-13 10:26:31 +000048 if (!pid) {
49 /* grandchild: kill child */
50 kill(child, SIGKILL);
Denys Vlasenko8ed57272009-02-25 14:24:02 +000051 exit(0);
Denys Vlasenko26de70e2009-02-13 10:26:31 +000052 }
Denys Vlasenko8ed57272009-02-25 14:24:02 +000053
Denys Vlasenko26de70e2009-02-13 10:26:31 +000054 /* Add various syscalls you want to test here.
55 * strace will decode them and suddenly find
56 * process disappearing.
57 * But leave at least one case "empty", so that
58 * "kill grandchild" happens quicker.
59 * This produces cases when strace can't even
60 * decode syscall number before process dies.
61 */
62 switch (loops & 1) {
Denys Vlasenko8ed57272009-02-25 14:24:02 +000063 case 0:
Denys Vlasenko8158e772011-06-08 14:08:59 +020064 break; /* intentionally empty */
Denys Vlasenko8ed57272009-02-25 14:24:02 +000065 case 1:
66 sendto(-1, "Hello cruel world", 17, 0, &sa, sizeof(sa));
67 break;
Denys Vlasenko26de70e2009-02-13 10:26:31 +000068 }
Denys Vlasenko8ed57272009-02-25 14:24:02 +000069
Denys Vlasenko26de70e2009-02-13 10:26:31 +000070 /* kill grandchild */
71 kill(pid, SIGKILL);
72 }
Denys Vlasenko8ed57272009-02-25 14:24:02 +000073
74 exit(0);
Denys Vlasenko26de70e2009-02-13 10:26:31 +000075 }
Denys Vlasenko8ed57272009-02-25 14:24:02 +000076
Denys Vlasenko26de70e2009-02-13 10:26:31 +000077 /* parent */
78 wait(NULL);
79 }
Denys Vlasenko8ed57272009-02-25 14:24:02 +000080
Denys Vlasenko26de70e2009-02-13 10:26:31 +000081 return 0;
82}