p8-10.c

来自「SUN Solaris8平台下进程间通信」· C语言 代码 · 共 48 行

C
48
字号
#include <signal.h>int flushinp();int def_prog_mode();int def_shell_mode();int doupdate(void);static void tstp(int dummy){    sigset_t mask, omask;    struct sigaction act, oact;    T(("tstp() called"));    /* 用户可能已改变程序方式下的tty位, 因此保存它们 */    def_prog_mode();    /* 阻塞窗口改变和计时信号。阻塞计时信号的原因是因为应用利用计时器重绘窗口 */    (void)sigemptyset(&mask);    (void)sigaddset(&mask, SIGALRM);#ifdef SIGWINCH    (void)sigaddset(&mask, SIGWINCH);#endif    (void)sigprocmask(SIG_BLOCK, &mask, &omask);    /* 结束窗口方式,这也导致重置终端状态回到原来的方式 */    endwin();    /* 放开SIGTSTP */    (void)sigemptyset(&mask);    (void)sigaddset(&mask, SIGTSTP);    (void)sigprocmask(SIG_UNBLOCK, &mask, NULL);    /* 再次发送SIGSTP给该进程并悬挂它 */     act.sa_handler = SIG_DFL;    sigemptyset(&act.sa_mask);    act.sa_flags = 0;#ifdef SA_RESTART    act.sa_flags |= SA_RESTART;#endif /* SA_RESTART */    sigaction(SIGTSTP, &act, &oact);    kill(getpid(), SIGTSTP);    /* 窗口进程被悬挂,经过一段时间后进程被恢复运行 */    T(("SIGCONT received"));    sigaction(SIGTSTP, &oact, NULL);    /* 扫出在cur_term->Filedes上的任何输出  */    flushinp();    /* 如果在悬挂期间用户修改了tty 状态,则他会希望有这种改变。       因此,保存新的"缺省"终端状态*/    def_shell_mode();    /* 恢复程序方式的tty状态 */    doupdate();    /* 重置SIGTSTP信号句柄 */    (void)sigprocmask(SIG_SETMASK, &omask, NULL);}

⌨️ 快捷键说明

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