发送信号
linux下,一个进程给其他进程发信号的api是
#include <sys/types.h>
#include <signal.h>
int kill ( pid_t pid , int sig );
成功返回o,失败返回-1,并设置errno,errno的参数可选为:
EINVAL(无效) EPERM (该进程无权限发给任何一个进程)ESRCH(目标进程或进程组不存在)
信号处理方式
typedef void(* __sighandler_t ) (int);
Linux信号
网络中常用到的是SIGHUP 、SIGPIPE、SIGURG
中断系统调用
进程在系统调用时候,凡是有信号发来,都会中断系统调用,并设置errno为EINTR,可以使用sigaction函数为信号设置SA_RESTART标志以自动重启该信号的中断。
对于默认行为是暂停的,在没定义信号处理函数的时候,也可以中断某些比如connect、epoll_wait的系统调用,这种是linux独有的。
信号函数
#include <signal.h>
_sighandler_t signal (int sig , _sighandler_t _handler );
返回值是一个指针,返回的是上一次传进来的函数指针,也可能返回SIG_DEF
错误返回SIG_ERR
sigaction的调用
更好的信号处理函数;
#include <sighal.h>
int sigaction ( int sig , const struct sigaction*act ,struct sigaction *oact ) ;
struct sigaction
{
#ifdef __USE_POSIX199309
union
{
_sighandler_t sa_handler;
void (*sa_sigaction) ( int , siginfo_t );
}
}_sigaction _handler;
#define sa_handler __sigaction_handler.sa_handler;
#define sa_sigaction __sigaction_handle.sa_sigaction;
#else
_sighandler_t sa_handler;
#endif
_sigset_t sa_mask;
int sa_flags;
void (*sa_restorer) void ;
}
信号集
是一个整型数组
进程信号掩码
int sigprocmask( int _how , _const sigset_t * _set ,sigset_t * _oset);
_how的值可选择为 SIG_BLOCK SIG_UNBLOCK SIG_SETMASK
被挂起的信号
将信号添加掩码后,进程不能收到该信号;
将信号挂起后,再取消挂起,就可以收到该信号;
int sigpending( sigset_t *set);
统一事件源
信号处理函数和程序的主循环是两种路,为了让信号尽快处理,有的方法是通过管道将信号发送到主循环,这里可以通过I/O复用的方式来将信号发到主循环,这是不是异步的处理方法呢?我们后续探讨
网络编程相关的信号
SIGHUP
控制服务器度配置文件
SIGPIPE
SIGURG