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 + -
显示快捷键?