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