main
信号捕捉的操作
sigaction
struct sigaction
OS不允许信号处理方法进行嵌套:某一个信号正在被处理时,OS会自动block改信号,之后会自动恢复
同理,sigaction.sa_mask 为捕捉指定信号后临时屏蔽的表
pending什么时候清零:调用handler前就清零,否则不能判断handler期间是否收到指定signal
可重入函数
问题:
一个函数,被两个以上的执行流进入了--重入
出问题了--不可重入函数
没出问题--可重入函数
如何判断可/不可重入
有全部资源:不可重入
全是局部:可
大部分都不可
函数名后带_r:可
volatile
关键字(异变关键字)
防止优化,保证每次从内存读取改变量,保证内存可见性。
因为常用与修饰容易改变的变量,所以叫做异变关键字
// 易变关键字
volatile int flag = 0;void change(int signo) // 信号捕捉的执行流
{(void)signo;flag = 1;printf("change flag 0->1, getpid: %d\n", getpid());
}int main()
{printf("I am main process, pid is : %d\n", getpid());signal(2, change);while(!flag); // 主执行流--- flag我们没有做任何修改!printf("我是正常退出的!\n");
}
0没有优化
1-3优化
为什么优化后不会退出
register 直接把一变量放到寄存器,不用每次从内存读取
信号流改变flag,只改变内存flag,对寄存器没有影响
所有的关键字都是给编译器看的,
SIGCHLD
子进程退出时,会给父进程发送SIGCHLD信号
code
// #include <iostream>
#include <stdio.h>
#include <signal.h>
#include <unistd.h>// 易变关键字
volatile int flag = 0;void change(int signo) // 信号捕捉的执行流
{(void)signo;flag = 1;printf("change flag 0->1, getpid: %d\n", getpid());
}int main()
{printf("I am main process, pid is : %d\n", getpid());signal(2, change);while(!flag); // 主执行流--- flag我们没有做任何修改!printf("我是正常退出的!\n");
}// // printBLocklist
// void PirintBLock()
// {
// sigset_t set, oset;
// sigemptyset(&set);
// sigemptyset(&oset);// sigprocmask(SIG_BLOCK, &set, &oset);
// std::cout << "block: ";
// for (int signo = 31; signo > 0; signo--)
// {
// if (sigismember(&oset, signo))
// {
// std::cout << 1;
// }
// else
// {
// std::cout << 0;
// }
// }
// std::cout << std::endl;
// }// void PrintPending()
// {
// sigset_t pending;
// ::sigpending(&pending);// std::cout << "Pending: ";
// for (int signo = 31; signo > 0; signo--)
// {
// if (sigismember(&pending, signo))
// {
// std::cout << 1;
// }
// else
// {
// std::cout << 0;
// }
// }
// std::cout << std::endl;
// }// void handler(int signo)
// {
// static int cnt = 0;
// cnt++;
// while (true)
// {
// std::cout << "get a sig: " << signo << ", cnt: " << cnt << std::endl;
// // PirintBLock();
// PrintPending();
// sleep(1);
// // break;
// }
// // exit(1);
// }// int main()
// {
// struct sigaction act, oact;
// act.sa_handler = handler;
// sigemptyset(&act.sa_mask);
// sigaddset(&act.sa_mask, 3);
// sigaddset(&act.sa_mask, 4);
// sigaddset(&act.sa_mask, 5);
// sigaddset(&act.sa_mask, 6);
// sigaddset(&act.sa_mask, 7);// ::sigaction(2, &act, &oact);// while (true)
// {
// // PirintBLock();
// PrintPending();
// pause();
// }
// }