📄 ecusighdl.c
字号:
pputs("\n"); } ecu_log_event(getpid(),s64); errno = save_errno; if(errno) pperror("errno may not apply, but"); } } restore_initial_colors(); } else /* we are rcvr */ { if(code > NSIG) { char s64[64]; sprintf(s64,"## RCVR %s, errno = %d",termecu_code_text(code), save_errno); setcolor(colors_error); pputs(s64); pputs("\n"); ecu_log_event(getpid(),s64); errno = save_errno; if(errno) pperror("errno may not apply, but"); } restore_initial_colors(); kill(xmtr_pid,SIGHUP); }#ifdef linux tcap_restore_con();#endif exit(code); /*NOTREACHED*/} /* end of termecu */SIGTYPErcvr_common_signal_handler(){ extern int rcvr_log; extern int rcvr_log_raw; extern FILE *rcvr_log_fp; if(rcvr_log) { if(!rcvr_log_raw) fputs("\n",rcvr_log_fp); fclose(rcvr_log_fp); } exit(0);}SIGTYPErcvr_SIGTERM_handler(){ rcvr_common_signal_handler();}SIGTYPErcvr_SIGINT_handler(){ signal(SIGINT,rcvr_SIGINT_handler);}SIGTYPErcvr_SIGUSR1_handler(){ rcvr_common_signal_handler();}SIGTYPErcvr_SIGUSR2_handler(){ signal(SIGUSR2,rcvr_SIGUSR2_handler); shmr_process_rcvr_SIGUSR2();}SIGTYPErcvr_SIGHUP_handler(){ rcvr_common_signal_handler();}/*+------------------------------------------------------------------------- rcvr_death_handler(sig) - unexpected signal; try to dump core--------------------------------------------------------------------------*/SIGTYPErcvr_death_handler(sig)int sig;{ int itmp;#ifdef TRICKY_SEGV int *open_elevator_shaft = (int *)(shm - 1);#endif ttymode(0); ff(se,"\nreceiver process caught signal %s\r\n", signal_name_text(sig)); ff(se,"screen cursor (y,x) = (%u,%u)\r\n",shm->cursor_y,shm->cursor_x); for(itmp = 1; itmp < NSIG; itmp++) signal(itmp,SIG_DFL);#ifdef TRICKY_SEGV signal(SIGSEGV,SIG_DFL); printf("oes=%08lx\n",open_elevator_shaft); itmp = *open_elevator_shaft;#else kill((PID_T)getpid(),SIGIOT);#endif _exit(-1);} /* end of rcvr_death_handler *//*+------------------------------------------------------------------------- xmtr_SIGINT_handler()--------------------------------------------------------------------------*/SIGTYPExmtr_SIGINT_handler(){ if(ttymode_termecu_on_sigint) termecu(SIGINT); signal(SIGINT,xmtr_SIGINT_handler); sigint = 1; proc_interrupt = 1;} /* end of xmtr_SIGINT_handler */SIGTYPExmtr_SIGHUP_handler(sig)int sig;{ termecu(sig);}SIGTYPExmtr_SIGTERM_handler(sig)int sig;{ termecu(sig);}SIGTYPExmtr_SIGUSR2_handler(){ SIGTYPE xmtr_SIGUSR2_handler(); signal(SIGUSR2,xmtr_SIGUSR2_handler); shmx_process_xmtr_SIGUSR2();}/*+------------------------------------------------------------------------- xmtr_death_handler(sig) - unexpected signal; try to dump core--------------------------------------------------------------------------*/SIGTYPExmtr_death_handler(sig)int sig;{ int itmp;#ifdef TRICKY_SEGV int *open_elevator_shaft = (int *)(shm - 1);#endif ttymode(0); ff(se,"\ntransmitter process caught signal %s\n", signal_name_text(sig)); kill_rcvr_process(SIGUSR1); for(itmp = 1; itmp < NSIG; itmp++) signal(itmp,SIG_DFL);#ifdef TRICKY_SEGV signal(SIGSEGV,SIG_DFL); printf("oes=%08lx\n",open_elevator_shaft); fflush(stdout); itmp = *open_elevator_shaft;#else kill((PID_T)getpid(),SIGIOT);#endif termecu(sig);} /* end of xmtr_death_handler *//*+------------------------------------------------------------------------- xmtr_SIGCLD_handler()--------------------------------------------------------------------------*/SIGTYPExmtr_SIGCLD_handler(){#if defined(FORK_DEBUG) char s40[40];#endifWAIT: errno = 0; if((last_child_wait_pid = wait(&last_child_wait_status)) < 0) { if(errno == EINTR) goto WAIT; }#if defined(FORK_DEBUG) sprintf(s40,"DEBUG fork SIGCLD pid %d term %x", last_child_wait_pid,last_child_wait_status); ecu_log_event(getpid(),s40); /* xmtr_SIGCLD_handler() */#endif if((last_child_wait_pid == rcvr_pid) && !xmtr_killed_rcvr) { ff(se,"\r\nECU receiver process died unexpectedly\r\n"); termecu(TERMECU_RCVR_FATAL_ERROR); } signal(SIGCLD,xmtr_SIGCLD_handler);} /* end of xmtr_SIGCLD_handler *//*+------------------------------------------------------------------------- child_signals() - signal() calls for children processes--------------------------------------------------------------------------*/voidchild_signals(){ int isig; for(isig = 0; isig < NSIG; isig++) signal(isig,SIG_DFL);} /* end of child_signals *//*+------------------------------------------------------------------------- xmtr_signals()--------------------------------------------------------------------------*/voidxmtr_signals(){ int sig; for(sig = 1; sig < NSIG; sig++) { switch(sig) { case SIGHUP: signal(sig,xmtr_SIGHUP_handler); break;#if defined(SIGSTOP) /* * call Roto-Rooter on POSIX plots */ case SIGSTOP: case SIGTSTP: case SIGCONT: case SIGTTIN: case SIGTTOU: signal(sig,SIG_IGN); break;#endif#ifdef SIGWINCH case SIGWINCH: signal(sig,SIG_DFL); break;#endif case SIGQUIT: signal(sig,SIG_IGN); break; case SIGINT: signal(sig,xmtr_SIGINT_handler); break; case SIGTERM: signal(sig,xmtr_SIGTERM_handler); break; case SIGCLD: signal(sig,xmtr_SIGCLD_handler); break; case SIGUSR1: signal(sig,SIG_IGN); break; case SIGUSR2: signal(sig,xmtr_SIGUSR2_handler); break; default: signal(sig,xmtr_death_handler); break; } }} /* end of xmtr_signals *//*+------------------------------------------------------------------------- rcvr_signals()--------------------------------------------------------------------------*/voidrcvr_signals(){ int sig; for(sig = 1; sig < NSIG; sig++) { switch(sig) { case SIGHUP: signal(sig,rcvr_SIGHUP_handler); break;#if defined(SIGSTOP) case SIGSTOP: case SIGTSTP: case SIGCONT: case SIGTTIN: case SIGTTOU: signal(sig,SIG_IGN); break;#endif#ifdef SIGWINCH case SIGWINCH:#endif case SIGCLD: signal(sig,SIG_DFL); break; case SIGQUIT: signal(sig,SIG_IGN); break; case SIGINT: signal(sig,rcvr_SIGINT_handler); break; case SIGTERM: signal(sig,rcvr_SIGTERM_handler); break; case SIGUSR1: signal(sig,rcvr_SIGUSR1_handler); break; case SIGUSR2: signal(sig,rcvr_SIGUSR2_handler); break; default: signal(sig,rcvr_death_handler); } }} /* end of rcvr_signals *//* vi: set tabstop=4 shiftwidth=4: */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -