1.信号简介
1.信号由[内核]产生发送的
2.信号的状态
产生
未决:未处理,等待被进程处理
递达:已经处理
3.信号处理方式
忽略
捕捉
执行了默认的操作
Term 终止
Ign 忽略
Core 终止后,产生core文件,用于调试
Stop 暂停
Cont 继续执行
4.查看信号的默认动作以及信号的含义:man 7 signal
SIGABRT 进程非正常终止, 可能来自 abort(3)
SIGALRM 警告钟
SIGUP 系统挂掉
SIGINT 终端ctrl+C
SIGQUIT 终端退出ctrl+\
SIGTERM 终止
SIGKILL 杀死进程信号
SIGPIPE 向没有读者的管道写入数据
SIGSEGV 段错误:无效内存段访问
SIGUSR1 用户自定义信号1
SIGUSR2 用户自定义信号2
SIGCHLD 子进程停止
2.信号的分类:可靠信号(实时信号)和不可靠信号(不实时信号)
1.常识结论
[1]实时信号都是可靠信号(支持排队);不实时信号都是不可靠信号(不支持排队)
[2]kill -l的前31个信号,都是不可靠信号;后面的都是可靠信号
2.定义:
不可靠信号:指向应用程序发送了3次信号,而应用程序只接收到1次信号
可靠信号:指向应用程序发送了3次信号,有下面两种情况保证信号可靠:
(1)应用程序收到3次信号
(2)即使没收到3次信号:假设收到1次信号,则会告诉应用程序还有2此信号没收到
3.不可靠信号存在的缺点:信号可能丢失
3.可中断睡眠
可中断睡眠的执行情况:
进程开始时处于可中断睡眠状态;那么如果进程接收到信号后,进程将被唤醒而不在阻
塞,当执行完信号处理函数后,进程继续向下执行。
4.sleep
unsigned int sleep(unsigned int seconds);
可中断睡眠:sleep在睡眠时,可能会被其他信号唤醒
sleep函数的返回值:如果被信号唤醒,返回剩余秒数
代码案例:
void handler(int arg){
printf("___________handler func\n");
}
int main(){
signal(SIGINT,handler);
//方式1:sleep(100);
/*
[1]按ctrl+C键,将调用SIGINT信号处理函数;
[2]sleep(100)将会被唤醒,程序不会继续睡下去,而是直接退出
结论:sleep函数是可中断睡眠,将会被信号唤醒
那么,怎样才能使得sleep睡够100s后,程序才退出呢?
*/
//方式2:使用sleep的返回值,使得sleep函数睡够100s
/*
[1]按ctrl+C键,将调用SIGINT信号处理函数
[2]sleep(100)将会被唤醒,返回值n为剩下的秒
数,由于处于while循环中,因此还会继续睡下去,直到睡够100s
*/
int n=10;
do{
printf("begin sleep\n");
n=sleep(n);
printf("begin awake\n");
}while(n>0);
}
5.pause
int pause(void); //将进程设为可中断睡眠状态
pause使得调用者被挂起,直到被一个信号唤醒