北京企业网站设计报价,男的和女的做那种短视频网站,修改网站首页排序,做自己的彩票网站main
信号捕捉的操作
sigaction struct sigaction OS不允许信号处理方法进行嵌套#xff1a;某一个信号正在被处理时#xff0c;OS会自动block改信号#xff0c;之后会自动恢复 同理#xff0c;sigaction.sa_mask 为捕捉指定信号后临时屏蔽的表 pending什么时候清零…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();
// }
// } 板书笔记