每种信号都有名字,都是以SIG开头
信号机制最简单的接口是signal函数
#include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); 返回值:成功以前的信号处理配置,出错SIG_ERR
kill函数将信号发送给进程或进程组。raise函数则允许进程向自身发送信号
#include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig); int raise(int sig); 返回值:成功0,出错-1
使用alarm可以设置一个定时器,在将来的某个时刻该定时器会超时
#include <unistd.h> unsigned int alarm(unsigned int seconds); 返回值:0或以前设置的闹钟时间的余留秒数
pause函数使调用进程挂起直至捕捉到一个信号
#include <unistd.h> int pause(void); 返回值:-1,errno设置EINTR
我们需要一个能表示多个信号的-----信号集
#include <signal.h> int sigemptyset(sigset_t *set); int sigfillset(sigset_t *set); int sigaddset(sigset_t *set, int signum); int sigdelset(sigset_t *set, int signum); 返回值:成功0,出错-1 int sigismember(const sigset_t *set, int signum); 返回值:真返回1,假0
检测或更改,或同时进行检测和更改进程的信号屏蔽字
#include <signal.h> int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); 返回值:成功0,出错-1
返回一信号集,该信号通过set参数返回
#include <signal.h> int sigpending(sigset_t *set); 返回值:成功0,出错-1
功能是检查或修改与指定信号相关联的处理动作。
#include <signal.h> int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 返回值:成功0,出错-1
非局部转移函数
#include <setjmp.h> int setjmp(jmp_buf env); int sigsetjmp(sigjmp_buf env, int savesigs); 返回值:直接调用0,若从siglongjmp调用返回,则为非0 void longjmp(jmp_buf env, int val0; void siglongjmp(sigjmp_buf env, int val);
在运行pause中,信号可能会丢失。为了纠正问题,需要在院子操作中先恢复信号屏蔽字,然后休眠。
#include <signal.h> int sigsuspend(const sigset_t *mask);
返回值:-1,并将errno设置为EINTR
终止异常的工作
#include <stdio.h> void abort(void); 返回值:不返回
睡眠函数,但是都有缺陷
#include <unistd.h> unsigned int sleep(unsigned int seconds); 返回值:0或未休眠完的秒数
nanosleep函数与sleep函数类似,提供了纳秒级精度
#include <time.h> int nanosleep(const struct timespec *req, struct timespec *rem); 返回值:休眠到要求的时间,返回0,出错-1
需要使用相对于特定时钟的延迟时间来挂起调用线程。
#include <time.h> int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *request, struct timespec *remain); 返回值:休眠要求的时间,返回0,出错返回错误码
使用sigqueue函数发送信号
#include <signal.h> int sigqueue(pid_t pid, int sig, const union sigval value); 返回值:成功0,出错-1
可以使用psinal函数可移植的打印与信号编号对应的字符串
#include <signal.h> void psignal(int sig, const char *s0; void psiginfo(const siginfo_t *pinfo, const char *s);
如果只需要信号的描述部分,与不需要把它写到标准错误文件中
#include <string.h> char *strsignal(int sig); 返回值:指向描述该信号的字符串的指针