Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
SIGACTION(2)		      System Calls Manual		  SIGACTION(2)

NAME
       sigaction -- software signal facilities

LIBRARY
       Standard	C Library (libc, -lc)

SYNOPSIS
       #include	<signal.h>

       struct  sigaction {
	       void    (*sa_handler)(int);
	       void    (*sa_sigaction)(int, siginfo_t *, void *);
	       int     sa_flags;	       /* see signal options below */
	       sigset_t	sa_mask;	       /* signal mask to apply */
       };

       int
       sigaction(int sig,		const struct sigaction * restrict act,
	   struct sigaction * restrict oact);

DESCRIPTION
       The system defines a set	of signals that	may be delivered to a process.
       Signal delivery resembles the occurrence	of a hardware  interrupt:  the
       signal  is normally blocked from	further	occurrence, the	current	thread
       context is saved, and a new one is built.   A  process  may  specify  a
       handler	to which a signal is delivered,	or specify that	a signal is to
       be ignored.  A process may also specify that a default action is	to  be
       taken by	the system when	a signal occurs.  A signal may also be blocked
       for a thread, in	which case it will not be delivered to that thread un-
       til  it is unblocked.  The action to be taken on	delivery is determined
       at the time of delivery.	 Normally, signal handlers execute on the cur-
       rent stack of the thread.  This may be changed, on a per-handler	basis,
       so that signals are taken on a special signal stack.

       Signal routines normally	execute	with the signal	that caused their  in-
       vocation	 blocked,  but	other  signals may yet occur.  A global	signal
       mask defines the	set of signals currently blocked from  delivery	 to  a
       thread.	 The  signal mask for a	thread is initialized from that	of its
       parent (normally	empty).	 It may	be changed with	 a  sigprocmask(2)  or
       pthread_sigmask(3) call,	or when	a signal is delivered to the thread.

       When  a	signal condition arises	for a process or thread, the signal is
       added to	a set of signals pending for the process or  thread.   Whether
       the  signal  is	directed  at  the  process in general or at a specific
       thread depends on how it	is generated.  For signals directed at a  spe-
       cific thread, if	the signal is not currently blocked by the thread then
       it is delivered to the thread.  For signals directed at the process, if
       the signal is not currently blocked by all threads then it is delivered
       to  one thread that does	not have it blocked (the selection of which is
       unspecified).  Signals may be delivered any time	a  thread  enters  the
       operating  system  (e.g.,  during a system call,	page fault or trap, or
       clock interrupt).  If multiple signals are ready	to be delivered	at the
       same time, any signals that could be  caused  by	 traps	are  delivered
       first.  Additional signals may be processed at the same time, with each
       appearing  to  interrupt	 the  handlers for the previous	signals	before
       their first instructions.  The set of pending signals  is  returned  by
       the  sigpending(2) system call.	When a caught signal is	delivered, the
       current state of	the thread is saved, a new signal mask	is  calculated
       (as  described  below), and the signal handler is invoked.  The call to
       the handler is arranged so that if the signal handling routine  returns
       normally	 the  thread  will resume execution in the context from	before
       the signal's delivery.  If the thread wishes to resume in  a  different
       context,	then it	must arrange to	restore	the previous context itself.

       When  a	signal is delivered to a thread	a new signal mask is installed
       for  the	 duration  of  the  process'  signal  handler  (or   until   a
       sigprocmask(2) system call is made).  This mask is formed by taking the
       union  of  the current signal mask set, the signal to be	delivered, and
       the signal mask associated with the handler to be invoked.

       The sigaction() system call assigns an action for a signal specified by
       sig.  If	act is non-NULL, it specifies an action	(SIG_DFL, SIG_IGN,  or
       a  handler  routine)  and mask to be used when delivering the specified
       signal.	If oact	is non-NULL, the previous handling information for the
       signal is returned to the user.

       The above declaration of	struct sigaction is not	literal.  It  is  pro-
       vided  only to list the accessible members.  See	<sys/signal.h> for the
       actual definition.  In particular, the storage occupied	by  sa_handler
       and  sa_sigaction overlaps, and it is nonsensical for an	application to
       attempt to use both simultaneously.

       Once a signal handler is	installed, it normally remains installed until
       another sigaction() system call is made,	or an execve(2)	is  performed.
       A  signal-specific default action may be	reset by setting sa_handler to
       SIG_DFL.	 The defaults are  process  termination,  possibly  with  core
       dump;  no action; stopping the process; or continuing the process.  See
       the signal list below for each signal's default action.	If  sa_handler
       is SIG_DFL, the default action for the signal is	to discard the signal,
       and if a	signal is pending, the pending signal is discarded even	if the
       signal  is masked.  If sa_handler is set	to SIG_IGN current and pending
       instances of the	signal are ignored and discarded.

       Options may be specified	by setting sa_flags.  The meaning of the vari-
       ous bits	is as follows:

	     SA_NOCLDSTOP    If	this bit is set	 when  installing  a  catching
			     function for the SIGCHLD signal, the SIGCHLD sig-
			     nal  will	be generated only when a child process
			     exits, not	when a child process stops.

	     SA_NOCLDWAIT    If	this bit is set	when calling  sigaction()  for
			     the  SIGCHLD  signal,  the	system will not	create
			     zombie processes when  children  of  the  calling
			     process  exit.   If  the  calling	process	subse-
			     quently issues  a	wait(2)	 (or  equivalent),  it
			     blocks  until  all	of the calling process's child
			     processes terminate, and then returns a value  of
			     -1	 with errno set	to ECHILD.  The	same effect of
			     avoiding zombie creation can also be achieved  by
			     setting sa_handler	for SIGCHLD to SIG_IGN.

	     SA_ONSTACK	     If	 this  bit is set, the system will deliver the
			     signal to the process on a	signal	stack,	speci-
			     fied by each thread with sigaltstack(2).

	     SA_NODEFER	     If	 this  bit  is set, further occurrences	of the
			     delivered signal are not masked during the	execu-
			     tion of the handler.

	     SA_RESETHAND    If	this bit is set, the handler is	reset back  to
			     SIG_DFL at	the moment the signal is delivered.

	     SA_RESTART	     See paragraph below.

	     SA_SIGINFO	     If	 this  bit is set, the handler function	is as-
			     sumed to be pointed to by the sa_sigaction	member
			     of	struct sigaction and should match  the	proto-
			     type shown	above or as below in "EXAMPLES".  This
			     bit  should  not be set when assigning SIG_DFL or
			     SIG_IGN.

       If a signal is caught during the	system calls listed  below,  the  call
       may  be	forced	to terminate with the error EINTR, the call may	return
       with a data transfer  shorter  than  requested,	or  the	 call  may  be
       restarted.   Restart  of	 pending  calls	 is  requested	by setting the
       SA_RESTART bit in sa_flags.  The	affected system	calls include open(2),
       read(2),	write(2), sendto(2), recvfrom(2), sendmsg(2) and recvmsg(2) on
       a communications	channel	or a slow device (such as a terminal, but  not
       a  regular file)	and during a wait(2) or	ioctl(2).  However, calls that
       have already committed are not restarted, but instead return a  partial
       success (for example, a short read count).

       After  a	 pthread_create(3)  the	 signal	 mask  is inherited by the new
       thread and the set of pending signals and the signal stack for the  new
       thread are empty.

       After  a	 fork(2)  or vfork(2) all signals, the signal mask, the	signal
       stack, and the restart/interrupt	flags are inherited by the child.

       The execve(2) system call reinstates the	default	action for all signals
       which were caught and resets all	signals	 to  be	 caught	 on  the  user
       stack.	Ignored	 signals  remain  ignored; the signal mask remains the
       same; signals that restart pending system calls continue	to do so.

       The following is	a list of all signals with names  as  in  the  include
       file <signal.h>:

       NAME	       Default Action	       Description
       SIGHUP	       terminate process       terminal	line hangup
       SIGINT	       terminate process       interrupt program
       SIGQUIT	       create core image       quit program
       SIGILL	       create core image       illegal instruction
       SIGTRAP	       create core image       trace trap
       SIGABRT	       create core image       abort(3)	call (formerly SIGIOT)
       SIGEMT	       create core image       emulate instruction executed
       SIGFPE	       create core image       floating-point exception
       SIGKILL	       terminate process       kill program
       SIGBUS	       create core image       bus error
       SIGSEGV	       create core image       segmentation violation
       SIGSYS	       create	core   image	   non-existent	  system  call
					       invoked
       SIGPIPE	       terminate process       write on	a pipe with no reader
       SIGALRM	       terminate process       real-time timer expired
       SIGTERM	       terminate process       software	termination signal
       SIGURG	       discard	signal		urgent	condition  present  on
					       socket
       SIGSTOP	       stop   process		 stop  (cannot	be  caught  or
					       ignored)
       SIGTSTP	       stop  process		stop  signal  generated	  from
					       keyboard
       SIGCONT	       discard signal	       continue	after stop
       SIGCHLD	       discard signal	       child status has	changed
       SIGTTIN	       stop  process		background read	attempted from
					       control terminal
       SIGTTOU	       stop process	       background write	 attempted  to
					       control terminal
       SIGIO	       discard signal	       I/O is possible on a descriptor
					       (see fcntl(2))
       SIGXCPU	       terminate  process	cpu  time  limit exceeded (see
					       setrlimit(2))
       SIGXFSZ	       terminate process       file size limit	exceeded  (see
					       setrlimit(2))
       SIGVTALRM       terminate   process	 virtual   time	  alarm	  (see
					       setitimer(2))
       SIGPROF	       terminate  process	profiling  timer  alarm	  (see
					       setitimer(2))
       SIGWINCH	       discard signal	       window size change
       SIGINFO	       discard signal	       status request from keyboard
       SIGUSR1	       terminate process       user defined signal 1
       SIGUSR2	       terminate process       user defined signal 2

NOTE
       The  sa_mask  field specified in	act is not allowed to block SIGKILL or
       SIGSTOP.	 Any attempt to	do so will be silently ignored.

       The following functions are either reentrant or	not  interruptible  by
       signals	and  are async-signal safe.  Therefore applications may	invoke
       them, without restriction, from signal-catching	functions  or  from  a
       child process after calling fork(2) in a	multi-threaded process:

       Base Interfaces:

       _Exit(),	 _exit(),  accept(), access(), alarm(),	bind(),	cfgetispeed(),
       cfgetospeed(), cfsetispeed(), cfsetospeed(), chdir(), chmod(), chown(),
       close(),	connect(), creat(), dup(), dup2(), execl(), execle(), execv(),
       execve(),  faccessat(),	fchdir(),  fchmod(),   fchmodat(),   fchown(),
       fchownat(),  fcntl(), fork(), fstat(), fstatat(), fsync(), ftruncate(),
       getegid(), geteuid(), getgid(), getgroups(), getpeername(),  getpgrp(),
       getpid(),  getppid(),  getsockname(),  getsockopt(),  getuid(), kill(),
       link(),	linkat(),  listen(),  lseek(),	lstat(),  mkdir(),  mkdirat(),
       mkfifo(),  mkfifoat(),  mknod(),	 mknodat(), open(), openat(), pause(),
       pipe(),	poll(),	  pselect(),   pthread_sigmask(),   raise(),   read(),
       readlink(),  readlinkat(),  recv(),  recvfrom(),	 recvmsg(),  rename(),
       renameat(), rmdir(), select(), send(), sendmsg(),  sendto(),  setgid(),
       setpgid(),  setsid(),  setsockopt(), setuid(), shutdown(), sigaction(),
       sigaddset(), sigdelset(), sigemptyset(),	 sigfillset(),	sigismember(),
       signal(),    sigpending(),    sigprocmask(),   sigsuspend(),   sleep(),
       sockatmark(), socket(), socketpair(), stat(),  symlink(),  symlinkat(),
       tcdrain(),     tcflow(),	    tcflush(),	  tcgetattr(),	  tcgetpgrp(),
       tcsendbreak(),  tcsetattr(),  tcsetpgrp(),  time(),  times(),  umask(),
       uname(),	unlink(), unlinkat(), utime(), wait(), waitpid(), write().

       X/Open Systems Interfaces:

       sigpause(), sigset(), utimes().

       Realtime	Interfaces:

       aio_error(),    clock_gettime(),	   timer_getoverrun(),	 aio_return(),
       fdatasync(), sigqueue(),	 timer_gettime(),  aio_suspend(),  sem_post(),
       timer_settime().

       Base Interfaces not specified as	async-signal safe by POSIX:

       fpathconf(), pathconf(),	sysconf().

       Base  Interfaces	 not  specified	 as  async-signal  safe	 by POSIX, but
       planned to be:

       ffs(),  htonl(),	 htons(),  memccpy(),  memchr(),  memcmp(),  memcpy(),
       memmove(),  memset(),  ntohl(), ntohs(),	stpcpy(), stpncpy(), strcat(),
       strchr(),   strcmp(),   strcpy(),   strcspn(),	strlen(),   strncat(),
       strncmp(),   strncpy(),	 strnlen(),  strpbrk(),	 strrchr(),  strspn(),
       strstr(),  strtok_r(),	wcpcpy(),   wcpncpy(),	 wcscat(),   wcschr(),
       wcscmp(),   wcscpy(),   wcscspn(),   wcslen(),	wcsncat(),  wcsncmp(),
       wcsncpy(),  wcsnlen(),  wcspbrk(),   wcsrchr(),	 wcsspn(),   wcsstr(),
       wcstok(), wmemchr(), wmemcmp(), wmemcpy(), wmemmove(), wmemset().

       Extension Interfaces:

       accept4(),    bindat(),	  close_range(),   closefrom(),	  connectat(),
       eaccess(),  ffsl(),   ffsll(),	flock(),   fls(),   flsl(),   flsll(),
       futimesat(), pipe2(), strlcat().	 strlcpy(), strsep().

       In addition, reading or writing errno is	async-signal safe.

       All  functions  not in the above	lists are considered to	be unsafe with
       respect to signals.  That is to say, the	behaviour of such functions is
       undefined when they are called from a signal handler  that  interrupted
       an  unsafe function.  In	general	though,	signal handlers	should do lit-
       tle more	than set a flag; most other actions are	not safe.

       Also, it	is good	practice to make a copy	of the global  variable	 errno
       and restore it before returning from the	signal handler.	 This protects
       against the side	effect of errno	being set by functions called from in-
       side the	signal handler.

RETURN VALUES
       The  sigaction()	 function returns the value 0 if successful; otherwise
       the value -1 is returned	and the	global variable	errno is set to	 indi-
       cate the	error.

EXAMPLES
       There are three possible	prototypes the handler may match:

	     ANSI C:
		    void handler(int);

	     Traditional BSD style:
		    void handler(int, int code,	struct sigcontext *scp);

	     POSIX SA_SIGINFO:
		    void handler(int, siginfo_t	*info, ucontext_t *uap);

       The  handler  function  should  match  the  SA_SIGINFO prototype	if the
       SA_SIGINFO bit is set in	sa_flags.  It then should be pointed to	by the
       sa_sigaction member of struct sigaction.	 Note that you should not  as-
       sign SIG_DFL or SIG_IGN this way.

       If  the	SA_SIGINFO  flag is not	set, the handler function should match
       either the ANSI C or traditional	BSD prototype and be pointed to	by the
       sa_handler member of struct sigaction.	In  practice,  FreeBSD	always
       sends  the three	arguments of the latter	and since the ANSI C prototype
       is a subset, both will work.   The  sa_handler  member  declaration  in
       FreeBSD	include	 files	is that	of ANSI	C (as required by POSIX), so a
       function	pointer	of a BSD-style function	needs to be casted to  compile
       without	warning.   The traditional BSD style is	not portable and since
       its capabilities	are a full subset of a SA_SIGINFO handler, its use  is
       deprecated.

       The  sig	 argument  is the signal number, one of	the SIG... values from
       <signal.h>.

       The code	argument of the	BSD-style handler and the  si_code  member  of
       the  info  argument  to a SA_SIGINFO handler contain a numeric code ex-
       plaining	the cause of the signal, usually one of	the SI_... values from
       <sys/signal.h> or codes specific	to a signal, i.e., one of the  FPE_...
       values for SIGFPE.

       The scp argument	to a BSD-style handler points to an instance of	struct
       sigcontext.

       The uap argument	to a POSIX SA_SIGINFO handler points to	an instance of
       ucontext_t.

ERRORS
       The sigaction() system call will	fail and no new	signal handler will be
       installed if one	of the following occurs:

       [EINVAL]		  The sig argument is not a valid signal number.

       [EINVAL]		  An attempt is	made to	ignore or supply a handler for
			  SIGKILL or SIGSTOP.

SEE ALSO
       kill(1),	    kill(2),	 ptrace(2),	setitimer(2),	 setrlimit(2),
       sigaltstack(2), sigpending(2), sigprocmask(2), sigsuspend(2),  wait(2),
       fpsetmask(3),  setjmp(3),  siginfo(3),  siginterrupt(3),	 sigsetops(3),
       ucontext(3), tty(4)

STANDARDS
       The  sigaction()	 system	 call  is  expected  to	 conform  to   ISO/IEC
       9945-1:1990  ("POSIX.1").   The	SA_ONSTACK  and	 SA_RESTART  flags are
       Berkeley	extensions, as	are  the  signals,  SIGTRAP,  SIGEMT,  SIGBUS,
       SIGSYS,	SIGURG,	SIGIO, SIGXCPU,	SIGXFSZ, SIGVTALRM, SIGPROF, SIGWINCH,
       and SIGINFO.  Those signals are available on most BSD-derived  systems.
       The  SA_NODEFER	and SA_RESETHAND flags are intended for	backwards com-
       patibility  with	 other	operating  systems.   The  SA_NOCLDSTOP,   and
       SA_NOCLDWAIT  flags are featuring options commonly found	in other oper-
       ating systems.  The flags are approved by Version 2 of the Single  UNIX
       Specification ("SUSv2"),	along with the option to avoid zombie creation
       by ignoring SIGCHLD.

FreeBSD	13.2			 June 29, 2020			  SIGACTION(2)

NAME | LIBRARY | SYNOPSIS | DESCRIPTION | NOTE | RETURN VALUES | EXAMPLES | ERRORS | SEE ALSO | STANDARDS

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=sigaction&sektion=2&manpath=FreeBSD+14.0-RELEASE+and+Ports>

home | help