signals.c

来自「android-w.song.android.widget」· C语言 代码 · 共 672 行 · 第 1/2 页

C
672
字号
{  sighandler_cxt dummy;  SigHandler *oh;#if defined (HAVE_POSIX_SIGNALS)  static int sigmask_set = 0;  static sigset_t bset, oset;#endif#if defined (HAVE_POSIX_SIGNALS)  if (rl_catch_signals && sigmask_set == 0)    {      sigemptyset (&bset);      sigaddset (&bset, SIGINT);      sigaddset (&bset, SIGTERM);#if defined (SIGQUIT)      sigaddset (&bset, SIGQUIT);#endif#if defined (SIGALRM)      sigaddset (&bset, SIGALRM);#endif#if defined (SIGTSTP)      sigaddset (&bset, SIGTSTP);#endif#if defined (SIGTTIN)      sigaddset (&bset, SIGTTIN);#endif#if defined (SIGTTOU)      sigaddset (&bset, SIGTTOU);#endif      sigmask_set = 1;    }      #endif /* HAVE_POSIX_SIGNALS */  if (rl_catch_signals && signals_set_flag == 0)    {#if defined (HAVE_POSIX_SIGNALS)      sigemptyset (&oset);      sigprocmask (SIG_BLOCK, &bset, &oset);#endif      rl_maybe_set_sighandler (SIGINT, rl_signal_handler, &old_int);      rl_maybe_set_sighandler (SIGTERM, rl_signal_handler, &old_term);#if defined (SIGQUIT)      rl_maybe_set_sighandler (SIGQUIT, rl_signal_handler, &old_quit);#endif#if defined (SIGALRM)      oh = rl_set_sighandler (SIGALRM, rl_signal_handler, &old_alrm);      if (oh == (SigHandler *)SIG_IGN)	rl_sigaction (SIGALRM, &old_alrm, &dummy);#if defined (HAVE_POSIX_SIGNALS) && defined (SA_RESTART)      /* If the application using readline has already installed a signal	 handler with SA_RESTART, SIGALRM will cause reads to be restarted	 automatically, so readline should just get out of the way.  Since	 we tested for SIG_IGN above, we can just test for SIG_DFL here. */      if (oh != (SigHandler *)SIG_DFL && (old_alrm.sa_flags & SA_RESTART))	rl_sigaction (SIGALRM, &old_alrm, &dummy);#endif /* HAVE_POSIX_SIGNALS */#endif /* SIGALRM */#if defined (SIGTSTP)      rl_maybe_set_sighandler (SIGTSTP, rl_signal_handler, &old_tstp);#endif /* SIGTSTP */#if defined (SIGTTOU)      rl_maybe_set_sighandler (SIGTTOU, rl_signal_handler, &old_ttou);#endif /* SIGTTOU */#if defined (SIGTTIN)      rl_maybe_set_sighandler (SIGTTIN, rl_signal_handler, &old_ttin);#endif /* SIGTTIN */      signals_set_flag = 1;#if defined (HAVE_POSIX_SIGNALS)      sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL);#endif    }#if defined (SIGWINCH)  if (rl_catch_sigwinch && sigwinch_set_flag == 0)    {      rl_maybe_set_sighandler (SIGWINCH, rl_sigwinch_handler, &old_winch);      sigwinch_set_flag = 1;    }#endif /* SIGWINCH */  return 0;}intrl_clear_signals (){  sighandler_cxt dummy;  if (rl_catch_signals && signals_set_flag == 1)    {      sigemptyset (&dummy.sa_mask);      rl_sigaction (SIGINT, &old_int, &dummy);      rl_sigaction (SIGTERM, &old_term, &dummy);#if defined (SIGQUIT)      rl_sigaction (SIGQUIT, &old_quit, &dummy);#endif#if defined (SIGALRM)      rl_sigaction (SIGALRM, &old_alrm, &dummy);#endif#if defined (SIGTSTP)      rl_sigaction (SIGTSTP, &old_tstp, &dummy);#endif /* SIGTSTP */#if defined (SIGTTOU)      rl_sigaction (SIGTTOU, &old_ttou, &dummy);#endif /* SIGTTOU */#if defined (SIGTTIN)      rl_sigaction (SIGTTIN, &old_ttin, &dummy);#endif /* SIGTTIN */      signals_set_flag = 0;    }#if defined (SIGWINCH)  if (rl_catch_sigwinch && sigwinch_set_flag == 1)    {      sigemptyset (&dummy.sa_mask);      rl_sigaction (SIGWINCH, &old_winch, &dummy);      sigwinch_set_flag = 0;    }#endif  return 0;}/* Clean up the terminal and readline state after catching a signal, before   resending it to the calling application. */voidrl_cleanup_after_signal (){  _rl_clean_up_for_exit ();  if (rl_deprep_term_function)    (*rl_deprep_term_function) ();  rl_clear_pending_input ();  rl_clear_signals ();}/* Reset the terminal and readline state after a signal handler returns. */voidrl_reset_after_signal (){  if (rl_prep_term_function)    (*rl_prep_term_function) (_rl_meta_flag);  rl_set_signals ();}/* Free up the readline variable line state for the current line (undo list,   any partial history entry, any keyboard macros in progress, and any   numeric arguments in process) after catching a signal, before calling   rl_cleanup_after_signal(). */ voidrl_free_line_state (){  register HIST_ENTRY *entry;  rl_free_undo_list ();  entry = current_history ();  if (entry)    entry->data = (char *)NULL;  _rl_kill_kbd_macro ();  rl_clear_message ();  _rl_reset_argument ();}#endif  /* HANDLE_SIGNALS *//* **************************************************************** *//*								    *//*			   SIGINT Management			    *//*								    *//* **************************************************************** */#if defined (HAVE_POSIX_SIGNALS)static sigset_t sigint_set, sigint_oset;static sigset_t sigwinch_set, sigwinch_oset;#else /* !HAVE_POSIX_SIGNALS */#  if defined (HAVE_BSD_SIGNALS)static int sigint_oldmask;static int sigwinch_oldmask;#  endif /* HAVE_BSD_SIGNALS */#endif /* !HAVE_POSIX_SIGNALS */static int sigint_blocked;static int sigwinch_blocked;/* Cause SIGINT to not be delivered until the corresponding call to   release_sigint(). */void_rl_block_sigint (){  if (sigint_blocked)    return;#if defined (HAVE_POSIX_SIGNALS)  sigemptyset (&sigint_set);  sigemptyset (&sigint_oset);  sigaddset (&sigint_set, SIGINT);  sigprocmask (SIG_BLOCK, &sigint_set, &sigint_oset);#else /* !HAVE_POSIX_SIGNALS */#  if defined (HAVE_BSD_SIGNALS)  sigint_oldmask = sigblock (sigmask (SIGINT));#  else /* !HAVE_BSD_SIGNALS */#    if defined (HAVE_USG_SIGHOLD)  sighold (SIGINT);#    endif /* HAVE_USG_SIGHOLD */#  endif /* !HAVE_BSD_SIGNALS */#endif /* !HAVE_POSIX_SIGNALS */  sigint_blocked = 1;}/* Allow SIGINT to be delivered. */void_rl_release_sigint (){  if (sigint_blocked == 0)    return;#if defined (HAVE_POSIX_SIGNALS)  sigprocmask (SIG_SETMASK, &sigint_oset, (sigset_t *)NULL);#else#  if defined (HAVE_BSD_SIGNALS)  sigsetmask (sigint_oldmask);#  else /* !HAVE_BSD_SIGNALS */#    if defined (HAVE_USG_SIGHOLD)  sigrelse (SIGINT);#    endif /* HAVE_USG_SIGHOLD */#  endif /* !HAVE_BSD_SIGNALS */#endif /* !HAVE_POSIX_SIGNALS */  sigint_blocked = 0;}/* Cause SIGWINCH to not be delivered until the corresponding call to   release_sigwinch(). */void_rl_block_sigwinch (){  if (sigwinch_blocked)    return;#if defined (HAVE_POSIX_SIGNALS)  sigemptyset (&sigwinch_set);  sigemptyset (&sigwinch_oset);  sigaddset (&sigwinch_set, SIGWINCH);  sigprocmask (SIG_BLOCK, &sigwinch_set, &sigwinch_oset);#else /* !HAVE_POSIX_SIGNALS */#  if defined (HAVE_BSD_SIGNALS)  sigwinch_oldmask = sigblock (sigmask (SIGWINCH));#  else /* !HAVE_BSD_SIGNALS */#    if defined (HAVE_USG_SIGHOLD)  sighold (SIGWINCH);#    endif /* HAVE_USG_SIGHOLD */#  endif /* !HAVE_BSD_SIGNALS */#endif /* !HAVE_POSIX_SIGNALS */  sigwinch_blocked = 1;}/* Allow SIGWINCH to be delivered. */void_rl_release_sigwinch (){  if (sigwinch_blocked == 0)    return;#if defined (HAVE_POSIX_SIGNALS)  sigprocmask (SIG_SETMASK, &sigwinch_oset, (sigset_t *)NULL);#else#  if defined (HAVE_BSD_SIGNALS)  sigsetmask (sigwinch_oldmask);#  else /* !HAVE_BSD_SIGNALS */#    if defined (HAVE_USG_SIGHOLD)  sigrelse (SIGWINCH);#    endif /* HAVE_USG_SIGHOLD */#  endif /* !HAVE_BSD_SIGNALS */#endif /* !HAVE_POSIX_SIGNALS */  sigwinch_blocked = 0;}/* **************************************************************** *//*								    *//*		Echoing special control characters		    *//*								    *//* **************************************************************** */voidrl_echo_signal_char (sig)     int sig;{  char cstr[3];  int cslen, c;  if (_rl_echoctl == 0 || _rl_echo_control_chars == 0)    return;  switch (sig)    {    case SIGINT:  c = _rl_intr_char; break;#if defined (SIGQUIT)    case SIGQUIT: c = _rl_quit_char; break;#endif#if defined (SIGTSTP)    case SIGTSTP: c = _rl_susp_char; break;#endif    default: return;    }  if (CTRL_CHAR (c) || c == RUBOUT)    {      cstr[0] = '^';      cstr[1] = CTRL_CHAR (c) ? UNCTRL (c) : '?';      cstr[cslen = 2] = '\0';    }  else    {      cstr[0] = c;      cstr[cslen = 1] = '\0';    }  _rl_output_some_chars (cstr, cslen);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?