文章目录
1,信号发送kill()/raise()
#include <unistd.h>
#include <signal.h>
int kill(pid_t pid, int sig);
int raise(int sig); //自己给自己发信号
- 成功时返回0,失败时返回EOF
- pid 接收进程的进程号;0代表同组进程; -1代表所有进程(除系统INIT进程和当前进程外的所有进程)
- sig 信号类型(通过宏指定)
可以通过getpid()获取当前进程的进程号,然后给当前进程发信号(也可以给父进程发信号)
2,创建一个定时器(,创建一个闹钟) alarm()
int alarm(unsigned int seconds);
- 成功时返回上个定时器的剩余时间,失败时返回EOF
- seconds 定时器的时间,如果seconds指定为0,意思是取消当前定时器
- 一个进程中只能设定一个定时器,时间到时产生SIGALRM
3,让进程进入等待态,进入睡眠pause()
int pause(void);
- 进程一直阻塞,直到被信号中断
- 被信号中断后返回-1,errno为EINTR
4,示例 alarm()、pause()
#include <stdio.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
alarm(3);
pause();//程序很短,执行很快,定时时间还没到,程序就已经结束了,所以要加pause()函数来产生等待
printf("I have been waken up!\n");
return 0;
}
linux@linux:~/test/interprocess$ gcc alarm_pause.c -o alarm_pause.out
linux@linux:~/test/interprocess$ ./alarm_pause.out
Alarm clock
- 重要:alarm经常用于实现超时检测
- alarm()产生的SIGALRM信号默认操作是终止信号,所以pause()后面的程序实际上是没有执行的
- 定时器信号缺省的默认处理方式会打印Alarm clock
5,设置信号响应方式*signal()
进程对信号有不同的响应方式 |
---|
缺省方式 |
忽略信号 |
捕捉信号 |
#include <unistd.h>
#include <signal.h>
void (*signal(int signo, void (*handler)(int)))(int);
- 成功时返回原先的信号处理函数,失败时返回SIG_ERR
- signo 要设置的信号类型(除SIGKILL、SIGSTOP外,这两个信号级别很高)
- handler 指定的信号处理函数: SIG_DFL代表缺省方式; SIG_IGN 代表忽略信号;捕捉信号,固定的函数接口handler()
- signal函数的作用是把一个信号和信号处理函数关联起来,本身并不会发送信号
6,示例signal()
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void handler (int signo)
{
if (signo == SIGINT)
{
printf("I have got SIGINT!\n");
}
if (signo == SIGQUIT)
{
printf("I have got SIGQUIT\n");
}
}
int main()
{
signal(SIGINT, handler);
signal(SIGQUIT, handler);
while ( 1 ) pause();
return 0;
}
linux@linux:~/test/interprocess$ ./signal.out
^CI have got SIGINT!
^\I have got SIGQUIT
^Z
[1]+ Stopped ./signal.out
linux@linux:~/test/interprocess$ jobs
[1]+ Stopped ./signal.out
linux@linux:~/test/interprocess$ fg 1
./signal.out
^CI have_ras3e got SIGINT!
^\I have got SIGQUIT