Ejemplo n.º 1
0
static void
tstp_handler (int signum)
{
  clock_freeze ();
  mode_signal (signum);
  prepare_for_exit ();
  install_signal (SIGTSTP, SIG_DFL);
  raise (SIGTSTP);
}
Ejemplo n.º 2
0
static void
cont_handler (int signum)
{
  install_signal (SIGTSTP, tstp_handler);

  refresh ();
  prepare_screen ();
  mode_redraw ();
  mode_signal (signum);
  clock_thaw ();
}
Ejemplo n.º 3
0
static RETSIGTYPE
generic_handler (int signum)
/* Interrupt handlers shouldn't do much.  So we just note that the
 * signal arrived.  */
{
  int  i;

  signal_arrived = 1;
  for (i=0; i<sig_info_table.used; ++i) {
    if (sig_info_table.data[i].signum == signum)  break;
  }
  assert (i<sig_info_table.used);
  sig_info_table.data[i].pending = 1;

  if (signum == SIGINT || signum == SIGHUP || signum == SIGTERM) {
    /* Pressing `C-c' twice exits, even if the program hangs.  */
    install_signal (signum, SIG_DFL);
  } else {
    install_signal (signum, generic_handler);
  }
}
Ejemplo n.º 4
0
static void
my_signal (int signum, void (*handler)(int), int ignore_test)
/* Install HANDLER as a new signal handler for signal SIGNUM.  But if
 * IGNORE_TEST is true and SIGNUM was ignored before, do nothing.  */
{
  struct sig_info *info;

  if (ignore_test) {
    struct sigaction  action;

    sigaction (signum, NULL, &action);
    if (action.sa_handler == SIG_IGN)  return;
  }

  DA_ADD_EMPTY (sig_info_table, struct sig_info, info);
  info->signum = signum;
  info->pending = 0;
  info->handler = handler;

  install_signal (signum, generic_handler);
}
Ejemplo n.º 5
0
void SignalInterface::initialize_platform(bool ctrlC) {
  init_sig_mask();
  if (! signal_stack) {
    init_signal_stack();
  }
  # ifndef ROSETTA
    install_signal(SIGSEGV,        signal_handler);
    install_signal(SIGNonLifo,     signal_handler);
    
    // catch all fatal errors
    install_signal(SIGILL,         signal_handler);
    install_signal(SIGABRT,        signal_handler);
    // want to use gdb always
    // install_signal(SIGEMT,         signal_handler);
    install_signal(SIGFPE,         signal_handler);
    install_signal(SIGBUS,         signal_handler);  
    install_signal(SIGSYS,         signal_handler);
  # endif
  // ^Z handling
  install_signal(SIGTSTP,        Signal_Handler_t(ctrl_z_handler));
  install_signal(SIGCONT,        Signal_Handler_t(ctrl_z_handler));
  
  // Self-level signals
  if (ctrlC) {
    install_signal(SIGQUIT,      signal_handler);
    install_signal(SIGINT,       signal_handler);
  }
  install_signal(SIGIO,          signal_handler);
  # ifndef ROSETTA
    install_signal(SIGUSR1,        signal_handler);
    install_signal(SIGUSR2,        signal_handler);
    install_signal(SIGPIPE,        signal_handler);
    install_signal(SIGTERM,        signal_handler);
    install_signal(SIGURG,         signal_handler);
    install_signal(SIGCHLD,        signal_handler);
    install_signal(SIGHUP,         signal_handler);
  # endif
  install_signal(SIGWINCH,       signal_handler);

# if TARGET_OS_VERSION == SUNOS_VERSION
  install_signal(SIGLOST, signal_handler);
# endif
}
Ejemplo n.º 6
0
Archivo: server.c Proyecto: yumm007/C
int main(int argc, char *argv[])
{
	int chnr = 0;
	struct channel_item_st *link = NULL;
	pthread_t pthd;

	openlog("netradio", LOG_PID, LOG_DAEMON);
	syslog(LOG_INFO, "daemon start.");

	sep_arg(&args);
	my_daemon();

	if (install_signal() != 0) {
		syslog(LOG_ERR, "install signal failed, exit.");
		closelog();
		exit(1);
	}

	if (save_pid(LOCK_FILE) == -1) {
		closelog();
		exit(1);
	}

	if ((sd = create_socket(args.multicast_group)) == -1) {
		syslog(LOG_ERR, "create socket failed, exit.");
		closelog();
		exit(1);
	}

	if (medialib_get_channellist(&chnr, &link) != 0) {
		syslog(LOG_ERR, "init channellist failed, exit.");
		closelog();
		close(sd);
		exit(1);
	}

	if (pthread_create(&pthd, NULL, channel_0_pth, link) != 0) {
		syslog(LOG_ERR, "init channel 0 failed, exit.");
		medialib_free_channellist(link);
		closelog();
		close(sd);
		exit(1);
	}

	//失败时会释放link 和已经打开的线程
	if (create_channel_pthread(link) == -1) {
		syslog(LOG_ERR, "init channel pthread failed, exit.");
		closelog();
		close(sd);
		exit(1);
	}

	wait_until_exit(link, chnr);

	pthread_cancel(pthd); /*cancel pth 0*/
	pthread_join(pthd, NULL);

	syslog(LOG_INFO, "netradio daemon exit.");
	closelog();
	close(sd);

	return 0;
}
Ejemplo n.º 7
0
void setup_signals()
{
    install_signal( SIGCHLD, SIGCHLD_handler);
    install_signal( SIGINT, SIGINT_handler);
}