您的位置:首页 > 教育 > 锐评 > 南宁网站建设方案详细方案_仓库管理系统app_百度数据研究中心官网_seo原创工具

南宁网站建设方案详细方案_仓库管理系统app_百度数据研究中心官网_seo原创工具

2025/8/30 11:21:08 来源:https://blog.csdn.net/li_peixiansang/article/details/143624478  浏览:    关键词:南宁网站建设方案详细方案_仓库管理系统app_百度数据研究中心官网_seo原创工具
南宁网站建设方案详细方案_仓库管理系统app_百度数据研究中心官网_seo原创工具

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();
//     }
// }

板书笔记:

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com