信号是一种软件中断,也是进程间唯一的异步通信方式。信号可通过硬件发送,如键入CTRL+C,或者程序发送。软件可通过signal函数捕捉信号,针对信号编写信号处理函数,进行异步操作。
在终端可用kill命令发送信号。信号有优先级,高优先级的首先处理。
1、signal(int signum,void (*f)(int))
第一个参数为需要处理的信号,第二个参数为信号处理函数的指针。函数要求必须含一个int参数和返回void。
#include "signal.h" void sig_process(int sig_no){ printf("signal has been received "); } int main(int argc,char* argv[]) { signal(SIGINT,sig_process); while(1); return 0; }
2、int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);
sigaction用来设置信号处理方式。第一参数为处理信号,act是一个记录行为的结构体。主要设置响应函数和是否嵌套响应等信息。
int main(int argc,char* argv[]) { //signal(SIGINT,sig_process); struct sigaction act; act.sa_handler=sig_process; act.sa_flags=SA_NOMASK;//if set this,nesting(嵌套) is allowed. sigaction(SIGINT,&act,NULL); while(1); return 0; }
3、int kill(pid_t pid,int sig);
参数分别是目标进程的pid和信号,成功返回0,失败返回-1.
使用sigqueue()也可以对目标进程发送信号,并发送数据。
4、int alarm(int seconds);
调用函数seconds秒后,系统会向调用alarm函数的进程发送一个SIGALRMd的信号。函数settimer()也具有定时功能,其选项比alarm丰富。
5、setprocmask()用来设置进程的屏蔽信号集;sigpending()用来查看被阻塞和未决的信号集。
6、pause();
调用后进程处于挂起状态,直到进程接收到任意信号才继续运行。可用于同步进程:先设置信号的处理函数,再挂起进程。其他进程的工作完成后向挂起的进程发送特定信号,挂起进程继续工作。