/**
 * Main
 */
int main(int argc, char* argv[], char* envp[]) {
  parent_pid = getpid();
  child_pid = fork();
  switch(child_pid) {
  case -1: {
    PFLUSH("Fork failed!\n");
    exit(-1);
  }
  case 0: {
    child_entry:
    child_loop();
    break;
  }
  default: {
    child_pid2 = fork();
    if (!child_pid2) {
      goto child_entry; 
    }
    struct sigaction sig_action;
    sig_action.sa_sigaction = &handle_signals_info;
    sig_action.sa_flags = SA_SIGINFO;
    sigemptyset(&sig_action.sa_mask);
    sigaction(SIGUSR1, &sig_action, NULL);
    sigaction(SIGUSR2, &sig_action, NULL);
    sigaction(SIGINT, &sig_action, NULL);
    while(1) {
      PFLUSH("waiting...         ");
      pause();
    }
    break;
  }
  }
  return 0;
}
コード例 #2
0
ファイル: sslstdio.c プロジェクト: Distrotech/imap
int PBOUT (int c)
{
  if (!sslstdio) return putchar (c);
				/* flush buffer if full */
  if (!sslstdio->octr && PFLUSH ()) return EOF;
  sslstdio->octr--;		/* count down one character */
  *sslstdio->optr++ = c;	/* write character */
  return c;			/* return that character */
}
/**
 * Handle User Signal.
 * Log the occurence of receiving a SIGUSR1 or SIGUSR2.
 */
void handle_signals_info(int sig, siginfo_t* info, void* v) {
  switch(sig) {
  case SIGUSR1:
  case SIGUSR2: {
    PFLUSH("received %s from: %d\n", strsignal(sig), info->si_pid);
    break;
  }
  case SIGINT: {
    PFLUSH("\n\treceived: %s\n\t%s %d... %s\n\t%s %d... %s\n\tparent shutting down...\n", 
	   strsignal(sig),
	   "killing child", child_pid,  (SEND_SIG(child_pid, SIGKILL) == 0) ? "OK" : "FAIL",
	   "killing child", child_pid2, (SEND_SIG(child_pid2, SIGKILL) == 0) ? "OK" : "FAIL");
    exit(0);
    break;
  }
  } 

}
コード例 #4
0
ファイル: sslstdio.c プロジェクト: Distrotech/imap
int PSOUT (char *s)
{
  if (!sslstdio) return fputs (s,stdout);
  while (*s) {			/* flush buffer if full */
    if (!sslstdio->octr && PFLUSH ()) return EOF;
    *sslstdio->optr++ = *s++;	/* write one more character */
    sslstdio->octr--;		/* count down one character */
  }
  return 0;			/* success */
}
コード例 #5
0
ファイル: sslstdio.c プロジェクト: Distrotech/imap
int PSOUTR (SIZEDTEXT *s)
{
  unsigned char *t = s->data;
  unsigned long i = s->size;
  unsigned long j;
  if (sslstdio) while (i) {	/* until request satisfied */
				/* flush buffer if full */
    if (!sslstdio->octr && PFLUSH ()) break;
				/* blat as big a chucnk as we can */
    memcpy (sslstdio->optr,t,j = min (i,sslstdio->octr));
    sslstdio->optr += j;	/* account for chunk */
    sslstdio->octr -= j;
    t += j;
    i -= j;
  }
  else while (i && ((j = fwrite (t,1,i,stdout)) || (errno == EINTR)))
    t += j,i -= j;
  return i ? EOF : NIL;
}
コード例 #6
0
ファイル: HALT.c プロジェクト: dank101/4.4BSD-Alpha
HALT()
{
		PFLUSH();
		fputs("Call to procedure halt\n", stderr);
		PCEXIT(0);
}