C++程序  |  53行  |  1.16 KB


#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

static struct sigaction oldChildHandlerData;

void theHandler(int arg)
{
  printf("handled %s\n", arg == SIGCHLD ? "SIGCHLD" : "?!unexpected signal?!" );
}

void setupHandlers()
{
  struct sigaction act;
  act.sa_handler=theHandler;
  sigemptyset(&(act.sa_mask));
  sigaddset(&(act.sa_mask), SIGCHLD);
  // Make sure we don't block this signal. gdb tends to do that :-(
  sigprocmask(SIG_UNBLOCK, &(act.sa_mask), 0);

  act.sa_flags = SA_NOCLDSTOP;

  // CC: take care of SunOS which automatically restarts interrupted system
  // calls (and thus does not have SA_RESTART)

#ifdef SA_RESTART
  act.sa_flags |= SA_RESTART;
#endif

  sigaction( SIGCHLD, &act, &oldChildHandlerData );

  act.sa_handler=SIG_IGN;
  sigemptyset(&(act.sa_mask));
  sigaddset(&(act.sa_mask), SIGPIPE);
  act.sa_flags = 0;
  sigaction( SIGPIPE, &act, 0L);
}

int main()
{
    char buffer[200];
    setupHandlers();
    FILE *p = popen("echo Hallo World", "r");
    while (!feof(p)) {
        int n = fread(buffer, 200, 1, p);
        __attribute__((unused)) ssize_t nw = write(2, buffer, n);
    }
    pclose(p);
    return 0;
}