linux进程间通信——信号(二)

信号的相关函数:

1)signal函数:


#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum,sighandler_t handler);

signal 的第1个参数signum表示要捕捉的信号,第2个参数是个函数指针,表示要对该信号进行捕捉的函数,该参数也可以是SIG_DEF(表示交由系统缺省处理,相当于白注册了)或SIG_IGN(表示忽略掉该信号而不做任何处理)。signal如果调用成功,返回以前该信号的处理函数的地址,否则返回 SIG_ERR。
sighandler_t是信号捕捉函数,由signal函数注册,注册以后,在整个进程运行过程中均有效,并且对不同的信号可以注册同一个信号捕捉函数。该函数只有一个参数,表示信号值。

2)sigaction函数

include <signal.h>
 int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

 signum:要操作的信号。
 act:要设置的对信号的新处理方式,指向sigaction结构的指针。
 oldact:原来对信号的处理方式。
 返回值:0 表示成功,-1 表示有错误发生

struct signaction结构体用来描述对信号的处理:

struct sigaction
 {
#ifdef __USE_POSIX199309

   **union   
     {
   __sighandler_t sa_handler;
   void (*sa_sigaction) (int, siginfo_t *, void *);
     }**

   __sigaction_handler;
# define sa_handler __sigaction_handler.sa_handler
# define sa_sigaction      __sigaction_handler.sa_sigaction
#else
   __sighandler_t sa_handler;
#endif

   ***__sigset_t sa_mask;
   int sa_flags;
   void (*sa_restorer) (void)***;
    };

联合数据结构中的两个元素_sa_handler以及*_sa_sigaction指定信号关联函数,即用户指定的信号处理函数。除了可以是用户自定义的处理函数外,还可以为SIG_DFL(采用缺省的处理方式),也可以为SIG_IGN(忽略信号)。

sa_handler:原型是一个参数为int,返回类型为void的函数指针。参数即为信号值,所以信号不能传递除信号值之外的任何信息。

sa_sigaction:原型是一个带三个参数,类型分别为int,struct siginfo ,void ,返回类型为void的函数指针。第一个参数为信号值;第二个参数是一个指向struct siginfo结构的指针,此结构中包含信号携带的数据值;第三个参数没有使用。

sa_mask:指定在信号处理程序执行过程中,哪些信号应当被阻塞。默认当前信号本身被阻塞。 
注意:sa_mask指定的信号阻塞的前提条件,是在由sigaction()安装信号的处理函数执行过程中由sa_mask指定的信号才被阻塞。

sa_flags:包含了许多标志位,比较重要的一个是SA_SIGINFO,当设定了该标志位时,表示信号附带的参数可以传递到信号处理函数中。即sa_sigaction指定信号处理函数,如果不设置SA_SIGINFO,信号处理函数同样不能得到信号传递过来的数据,在信号处理函数中对这些信息的访问都将导致段错误。

sa_restorer:已过时,POSIX不支持它,不应再使用。

signal用于安装不可靠信号 ; linux现在用sigaction实现sigaction用于安装可靠信号,当然也可以安装不可靠信号并且可以附带更多的信息。

3)pause函数


#include <unistd.h>
int pause(void);

pause() 库函数使调用进程(或线程)睡眠状态,直到接收到信号,要么终止,或导致它调用一个信号捕获函数。

返回值

The pause() function only returns when a signal was caught and the signal-catching function returned. In this case pause() returns -1, and errno is set to EINTR.

猜你喜欢

转载自blog.csdn.net/cainiao000001/article/details/81149088