⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 psignal.c

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 C
字号:
/* *  $Id: psignal.c,v 1.51 2002/11/05 19:46:26 joel Exp $ */#if HAVE_CONFIG_H#include "config.h"#endif#include <assert.h>#include <errno.h>#include <pthread.h>#include <signal.h>#include <string.h>	/* memcpy */#include <stdlib.h>	/* exit */#include <rtems/system.h>#include <rtems/score/isr.h>#include <rtems/score/thread.h>#include <rtems/score/tqdata.h>#include <rtems/score/wkspace.h>#include <rtems/seterr.h>#include <rtems/posix/threadsup.h>#include <rtems/posix/psignal.h>#include <rtems/posix/pthread.h>#include <rtems/posix/time.h>#include <stdio.h>/*** PROCESS WIDE STUFF ****/sigset_t  _POSIX_signals_Pending;void _POSIX_signals_Abnormal_termination_handler( int signo ){  exit( 1 );}#define SIG_ARRAY_MAX  (SIGRTMAX + 1)struct sigaction _POSIX_signals_Default_vectors[ SIG_ARRAY_MAX ] = {  /* NO SIGNAL 0 */  SIGACTION_IGNORE,  /* SIGHUP    1 */  SIGACTION_TERMINATE,  /* SIGINT    2 */  SIGACTION_TERMINATE,  /* SIGQUIT   3 */  SIGACTION_TERMINATE,  /* SIGILL    4 */  SIGACTION_TERMINATE,  /* SIGTRAP   5 */  SIGACTION_TERMINATE,  /* SIGIOT    6 */  SIGACTION_TERMINATE,  /* SIGABRT   6     SIGACTION_TERMINATE, -- alias for SIGIOT */  /* SIGEMT    7 */  SIGACTION_TERMINATE,  /* SIGFPE    8 */  SIGACTION_TERMINATE,  /* SIGKILL   9 */  SIGACTION_TERMINATE,  /* SIGBUS   10 */  SIGACTION_TERMINATE,  /* SIGSEGV  11 */  SIGACTION_TERMINATE,  /* SIGSYS   12 */  SIGACTION_TERMINATE,  /* SIGPIPE  13 */  SIGACTION_TERMINATE,  /* SIGALRM  14 */  SIGACTION_TERMINATE,  /* SIGTERM  15 */  SIGACTION_TERMINATE,  /* SIGURG   16 */  SIGACTION_TERMINATE,  /* SIGSTOP  17 */  SIGACTION_TERMINATE,  /* SIGTSTP  18 */  SIGACTION_TERMINATE,  /* SIGCONT  19 */  SIGACTION_TERMINATE,  /* SIGCHLD  20 */  SIGACTION_TERMINATE,  /* SIGTTIN  21 */  SIGACTION_TERMINATE,  /* SIGTTOU  22 */  SIGACTION_TERMINATE,  /* SIGIO    23 */  SIGACTION_TERMINATE,  /* SIGWINCH 24 */  SIGACTION_TERMINATE,  /* SIGUSR1  25 */  SIGACTION_TERMINATE,  /* SIGUSR2  26 */  SIGACTION_TERMINATE,  /* SIGRT    27 */  SIGACTION_TERMINATE,  /* SIGRT    28 */  SIGACTION_TERMINATE,  /* SIGRT    29 */  SIGACTION_TERMINATE,  /* SIGRT    30 */  SIGACTION_TERMINATE,  /* SIGRTMAX 31 */  SIGACTION_TERMINATE};struct sigaction _POSIX_signals_Vectors[ SIG_ARRAY_MAX ];Watchdog_Control _POSIX_signals_Alarm_timer;Thread_queue_Control _POSIX_signals_Wait_queue;Chain_Control _POSIX_signals_Inactive_siginfo;Chain_Control _POSIX_signals_Siginfo[ SIG_ARRAY_MAX ];/*PAGE * *  XXX - move these */#define _States_Is_interruptible_signal( _states ) \  ( ((_states) & \    (STATES_WAITING_FOR_SIGNAL|STATES_INTERRUPTIBLE_BY_SIGNAL)) == \      (STATES_WAITING_FOR_SIGNAL|STATES_INTERRUPTIBLE_BY_SIGNAL))/* *  _POSIX_signals_Post_switch_extension */void _POSIX_signals_Post_switch_extension(  Thread_Control  *the_thread){  POSIX_API_Control  *api;  int                 signo;  ISR_Level           level;  api = the_thread->API_Extensions[ THREAD_API_POSIX ];  /*   *  If we invoke any user code, there is the possibility that   *  a new signal has been posted that we should process so we   *  restart the loop if a signal handler was invoked.   *   *  The first thing done is to check there are any signals to be    *  processed at all.  No point in doing this loop otherwise.   */restart:  _ISR_Disable( level );    if ( !(~api->signals_blocked &           (api->signals_pending | _POSIX_signals_Pending)) ) {     _ISR_Enable( level );     return;   }  _ISR_Enable( level );  for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {    if ( _POSIX_signals_Check_signal( api, signo, FALSE ) )      goto restart;    if ( _POSIX_signals_Check_signal( api, signo, TRUE ) )      goto restart;  }/* XXX - add __SIGFIRSTNOTRT or something like that to newlib signal .h */  for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) {    if ( _POSIX_signals_Check_signal( api, signo, FALSE ) )      goto restart;     if ( _POSIX_signals_Check_signal( api, signo, TRUE ) )      goto restart;  }}/*PAGE * *  _POSIX_signals_Alarm_TSR */ void _POSIX_signals_Alarm_TSR(  Objects_Id      id,  void           *argument){  int status;  status = kill( getpid(), SIGALRM );  /* XXX can't print from an ISR, should this be fatal? */  assert( !status );}/*PAGE * *  _POSIX_signals_Manager_Initialization */void _POSIX_signals_Manager_Initialization(  int  maximum_queued_signals){  unsigned32 signo;  /*   *  Insure we have the same number of vectors and default vector entries   */  assert(   sizeof(_POSIX_signals_Vectors) == sizeof(_POSIX_signals_Default_vectors)  );  memcpy(     _POSIX_signals_Vectors,    _POSIX_signals_Default_vectors,    sizeof( _POSIX_signals_Vectors )  );    /*   *  Initialize the set of pending signals for the entire process   */  sigemptyset( &_POSIX_signals_Pending );  /*   *  Initialize the timer used to implement alarm().   */  _Watchdog_Initialize(    &_POSIX_signals_Alarm_timer,    _POSIX_signals_Alarm_TSR,    0,    NULL  );   /*   *  Initialize the queue we use to block for signals   */   _Thread_queue_Initialize(    &_POSIX_signals_Wait_queue,    THREAD_QUEUE_DISCIPLINE_PRIORITY,    STATES_WAITING_FOR_SIGNAL | STATES_INTERRUPTIBLE_BY_SIGNAL,    EAGAIN  );  /* XXX status codes */  /*    *  Allocate the siginfo pools.   */  for ( signo=1 ; signo<= SIGRTMAX ; signo++ )    _Chain_Initialize_empty( &_POSIX_signals_Siginfo[ signo ] );  _Chain_Initialize(    &_POSIX_signals_Inactive_siginfo,    _Workspace_Allocate_or_fatal_error(      maximum_queued_signals * sizeof( POSIX_signals_Siginfo_node )    ),    maximum_queued_signals,    sizeof( POSIX_signals_Siginfo_node )  );}

⌨️ 快捷键说明

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