1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <signal.h>
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h>
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <unistd.h>
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic struct sigaction oldChildHandlerData;
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid theHandler(int arg)
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  printf("handled %s\n", arg == SIGCHLD ? "SIGCHLD" : "?!unexpected signal?!" );
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid setupHandlers()
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  struct sigaction act;
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  act.sa_handler=theHandler;
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  sigemptyset(&(act.sa_mask));
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  sigaddset(&(act.sa_mask), SIGCHLD);
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  // Make sure we don't block this signal. gdb tends to do that :-(
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  sigprocmask(SIG_UNBLOCK, &(act.sa_mask), 0);
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  act.sa_flags = SA_NOCLDSTOP;
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  // CC: take care of SunOS which automatically restarts interrupted system
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  // calls (and thus does not have SA_RESTART)
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef SA_RESTART
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  act.sa_flags |= SA_RESTART;
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  sigaction( SIGCHLD, &act, &oldChildHandlerData );
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  act.sa_handler=SIG_IGN;
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  sigemptyset(&(act.sa_mask));
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  sigaddset(&(act.sa_mask), SIGPIPE);
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  act.sa_flags = 0;
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  sigaction( SIGPIPE, &act, 0L);
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main()
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    char buffer[200];
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    setupHandlers();
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    FILE *p = popen("echo Hallo World", "r");
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    while (!feof(p)) {
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        int n = fread(buffer, 200, 1, p);
48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        __attribute__((unused)) ssize_t nw = write(2, buffer, n);
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }
50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    pclose(p);
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    return 0;
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
53