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