当前位置: 首页 > news >正文

普通网站可以做商城二级域名ip查询

普通网站可以做商城,二级域名ip查询,网站打模块,wordpress安全#x1f4dd;个人主页#x1f339;#xff1a;Eternity._ ⏩收录专栏⏪#xff1a;Linux “ 登神长阶 ” #x1f339;#x1f339;期待您的关注 #x1f339;#x1f339; ❀Linux进程间通信 #x1f4d2;1. 信号的保存#x1f30a;在内核中的表示#x1f342;sigs… 个人主页Eternity._ ⏩收录专栏⏪Linux “ 登神长阶 ” 期待您的关注 ❀Linux进程间通信 1. 信号的保存在内核中的表示sigset_t 2. 信号集操作函数3. 信号的处理sigaction 4. 可重入函数5. volatile6. 总结SIGCHLD信号了解 前言在Linux操作系统的广阔天地中信号机制无疑是一个充满挑战与机遇的领域。信号作为进程间通信的一种重要方式不仅承载着丰富的信息还扮演着进程控制与管理的重要角色。然而对于许多初学者而言信号的保存与处理往往是一个难以逾越的障碍 本文旨在为广大Linux学习者提供一份详尽而实用的指南帮助他们深入理解Linux中的信号机制掌握信号的保存与处理技巧。我们将从信号的基本概念出发逐步深入到信号的捕获、保存、处理以及恢复等各个环节通过生动的实例和详细的解释让读者能够轻松掌握这一复杂而强大的功能 让我们一同踏上这段充满探索与发现的旅程共同揭开Linux信号机制的神秘面纱吧 1. 信号的保存 信号其他相关常见概念 实际执行信号的处理动作称为信号递达(Delivery)信号从产生到递达之间的状态,称为信号未决(Pending)进程可以选择阻塞 (Block )某个信号被阻塞的信号产生时将保持在未决状态直到进程解除对此信号的阻塞才执行递达的动作注意阻塞和忽略是不同的只要信号被阻塞就不会递达而忽略是在递达之后可选的一种处理动作 在内核中的表示 在Linux内核中信号的保存主要依赖于三种数据结构pending表、block表和handler表 pending表 pending表是一张位图bitmap用于记录当前进程是否收到了信号以及收到了哪些信号当进程接收到一个信号时对应的信号位图上的比特位就会由0置1表示该信号处于未决Pending状态 block表 block表也是一张位图用于记录特定信号是否被屏蔽阻塞比特位的内容为0表示不屏蔽为1表示屏蔽。屏蔽的信号在解除屏蔽之前不会被操作系统处理 handler表 handler表是一个函数指针数组用于保存每个信号对应的处理方法这些处理方法可以是默认的或者忽略的当然也可以是用户自定义的。当信号被递达时操作系统会根据handler表找到对应的处理方法并执行 举个例子上图SIGINT信号产生过但正在被阻塞所以暂时不能递达。虽然它的处理动作是忽略但在没有解除阻塞之前不能忽略这个信号因为进程仍有机会改变处理动作之后再解除阻塞 sigset_t sigset_t是一个在Unix和Linux系统中用于表示信号集的数据类型。信号集本质上是一个信号的集合用于指定多个信号通过使用sigset_t可以轻松地指定一组信号并在诸如信号阻塞、信号等待等操作中使用这组信号 sigset_t信号集操作函数 sigemptyset()初始化信号集将其设置为空集sigfillset()初始化信号集将其设置为包含所有信号的集合sigaddset()向信号集中添加一个信号sigdelset()从信号集中删除一个信号sigismember()检查一个信号是否属于某个信号集 2. 信号集操作函数 信号集操作函数用于处理与信号集sigset_t类型相关的操作。这些函数允许用户初始化信号集、添加或删除信号、检查信号是否存在于信号集中以及修改进程的信号屏蔽字 sigprocmask()函数 读取或更改进程的信号屏蔽字(阻塞信号集) 返回值:若成功则为0,若出错则为-1 int sigprocmask(int how, const sigset_t *set, sigset_t *oset);如果oset是非空指针,则读取进程的当前信号屏蔽字通过oset参数传出。如果set是非空指针,则 更改进程的信号屏蔽字,参数how指示如何更改。如果oset和set都是非空指针,则先将原来的信号 屏蔽字备份到oset里,然后根据set和how参数更改信号屏蔽字。假设当前的信号屏蔽字为mask,下表说明了how参数的可选值 代码示例 void headler(int signo) {cout headler: signo endl;// exit(0); }int main() {cout pid: getpid() endl;signal(2, headler);sigset_t block, oblock;// 初始化sigemptyset(block);sigemptyset(oblock);sigaddset(block, 2); // 设置对2号信号的屏蔽sigprocmask(SIG_BLOCK, block, oblock);while(1){sleep(1);}return 0; }那我们到底能不能屏蔽所有普通信号呢我们来测试一下 修改代码 for(int signo 1; signo 31; signo) sigaddset(block, signo);我们发现9号信号19号信号是不会被屏蔽的 注意如果调用sigprocmask解除了对当前若干个未决信号的阻塞,则在sigprocmask返回前,至少将其中一个信号递达 sigpending()函数 读取当前进程的未决信号集,通过set参数传出 返回值调用成功则返回0出错则返回-1 int sigpending(sigset_t *set);代码示例 void PrintPending(const sigset_t pending) {for(int signo 32; signo 0; signo--){if(sigismember(pending, signo)){cout 1;}else{cout 0;}}cout endl; }int main() {cout pid: getpid() endl;// 屏蔽2号信号sigset_t set, oset;sigemptyset(set);sigemptyset(oset);sigaddset(set, 2);sigprocmask(SIG_BLOCK, set, oset);int cnt 0; // 让进程不断获取当前进程的pendingsigset_t pending;while(1){sigpending(pending);PrintPending(pending);sleep(1);// 对2好信号进行解除屏蔽cnt;if(cnt 16){cout 对2号信号进行解除屏蔽准备递达 endl;sigprocmask(SIG_SETMASK, oset, nullptr);}}return 0; }当我们对信号进行处理的时候会先将pending位图中的1 - 0然后再去调用信号捕捉方法 3. 信号的处理 进程从内核态返回到用户态的时候包含身份的变化进行信号的检测和信号的处理 用户态是一种受控的状态能够访问的资源是有限的只能访问自己的[ 0 - 3GB] 内核态是一种操作系统的工作状态能够访问大部分系统资源可以让用户以OS的身份访问[ 3 - 4GB] 调用系统调用接口就是在进程地址空间中进行的 sigaction sigaction是一个POSIX标准的系统调用用于更改和检查信号的处理方式。与传统的signal函数相比sigaction提供了更多的控制选项和更可靠的信号处理方式 int sigaction(int signo, const struct sigaction *act, struct sigaction *oldact);signum信号编号指定要设置的信号act指向sigaction结构的指针在sigaction的实例中指定了对特定信号的处理。如果为NULL则进程会以缺省方式对信号处理oldact指向的对象用来保存原来对相应信号的处理如果为NULL则不保存 act和oldact指向sigaction结构体 代码示例 void Print(const sigset_t pending);void handler(int signo) {cout get a signo: signo endl;while(1){sigset_t pending;sigpending(pending);Print(pending);sleep(1);} }void Print(const sigset_t pending) {for(int signo 31; signo 0; signo--){if(sigismember(pending, signo)){cout 1;}else{cout 0;}}cout endl; }int main() {cout pid: getpid() endl;struct sigaction act, oact;act.sa_handler handler;// 增加对3号信息的屏蔽sigemptyset(act.sa_mask);sigaddset(act.sa_mask, 3);// 对2信号进行屏蔽sigaction(2, act, oact); while(1) sleep(1);return 0; }当某个信号的处理函数被调用时内核自动将当前信号加入进程的信号屏蔽字当信号处理函数返回时自动恢复原来的信号屏蔽字这样就保证了在处理某个信号时如果这种信号再次产生那么 它会被阻塞到当前处理结束为止如果在调用信号处理函数时除了当前信号被自动屏蔽之外还希望自动屏蔽另外一些信号,则用sa_mask字段说明这些需要额外屏蔽的信号当信号处理函数返回时自动恢复原来的信号屏蔽字 多个信号情况 代码示例 void Print(const sigset_t pending);void handler(int signo) {cout get a signo: signo endl;sleep(1); }void Print(const sigset_t pending) {for(int signo 31; signo 0; signo--){if(sigismember(pending, signo)){cout 1;}else{cout 0;}}cout endl; }int main() {signal(2, handler);signal(3, handler);signal(4, handler);signal(5, handler);sigset_t mask, omask;sigemptyset(mask);sigemptyset(omask);sigaddset(mask, 2);sigaddset(mask, 3);sigaddset(mask, 4);sigaddset(mask, 5);sigprocmask(SIG_SETMASK, mask, omask);cout pid: getpid() endl;int cnt 20;while(1) {sigset_t pending;sigpending(pending);Print(pending);cnt--;sleep(1);if(cnt 0){sigprocmask(SIG_SETMASK, omask, nullptr);cout cancel 2,3,4,5 block endl;}}return 0; }由实验结果来看我们系统是等所有的信号处理完全了统一再进行返回的并且他并不是按照顺序来处理信号的 4. 可重入函数 可重入函数是指可以被多个任务如线程、进程同时调用并且能保证每个任务调用该函数时都能得到正确结果的函数。换句话说这种函数在执行的任何时刻都可以被中断然后在中断点恢复执行而不会导致错误 main函数调用 insert函数向一个链表head中插入节点node1插入操作分为两步刚做完第一步的 时候因为硬件中断使进程切换到内核再次回用户态之前检查到有信号待处理于是切换 到sighandler函数sighandler也调用insert函数向同一个链表head中插入节点node2插入操作的 两步都做完之后从sighandler返回内核态再次回到用户态就从main函数调用的insert函数中继续 往下执行先前做第一步之后被打断现在继续做完第二步。结果是main函数和sighandler先后 向链表中插入两个节点而最后只有一个节点真正插入链表中insert函数被不同的控制流程调用,有可能在第一次调用还没返回时就再次进入该函数这称为重入insert函数访问一个全局链表有可能因为重入而造成错乱像这样的函数称为 不可重入函数反之如果一个函数只访问自己的局部变量或参数则称为可重入(Reentrant) 函数 不可重入函数符合以下任一条件 调用了malloc或free因为malloc也是用全局链表来管理堆的调用了标准I/O库函数标准I/O库的很多实现都以不可重入的方式使用全局数据结构 5. volatile volatile是一个类型修饰符用于告诉虚拟机该变量是极有可能多变的从而免于一些优化措施确保变量的正确性和线程间的通信。它主要用于多线程环境下的变量共享确保变量的可见性和有序性 代码示例 #include iostream #include signal.h #include unistd.husing namespace std;int flag 0;void headler(int signo) {cout signo: signo endl;flag 1;cout change flag to: flag endl; }int main() {signal(2, headler);cout pid: getpid() endl;while(!flag);cout qiut normal! endl;return 0; }标准情况下键入 CTRL-C 2号信号被捕捉执行自定义动作修改 flag1 while 条件不满足退出循环进程退出 优化情况下-O2(不是数字0)键入 CTRL-C ,2号信号被捕捉执行自定义动作修改 flag1 但是 while 条件依旧满足进程继续运行 所以要想不让编译器优化我们需要加上volatile volatile int flag 0;6. 总结 SIGCHLD信号了解 SIGCHLD信号在子进程状态改变时发送给其父进程。子进程的状态改变包括以下几种情况 子进程终止无论是正常终止还是异常终止如有core dump或无core dump子进程停止例如接收到SIGSTOP信号停止的子进程被SIGCONT信号唤醒并继续执行 代码示例 #include iostream #include signal.h #include unistd.h #include stdlib.h #include sys/types.h #include sys/wait.h using namespace std;void handle(int signo) { int status; pid_t pid; while ((pid waitpid(-1, status, WNOHANG)) 0) { if (WIFEXITED(status)) { printf(Child %d exited with status %d\n, pid, WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) { printf(Child %d killed by signal %d\n, pid, WTERMSIG(status)); } } } int main() { pid_t pid; struct sigaction act; // 设置SIGCHLD信号的处理函数 act.sa_handler handle; sigemptyset(act.sa_mask); act.sa_flags 0; sigaction(SIGCHLD, act, NULL); // 创建子进程 pid fork(); if (pid 0) { perror(fork); exit(1); } else if (pid 0){ // 子进程代码 printf(Child process (PID: %d) is running\n, getpid()); sleep(5); // 模拟子进程工作 exit(0); // 子进程正常退出 } else { // 父进程代码 printf(Parent process (PID: %d) is running\n, getpid()); // 父进程可以继续执行其他任务等待SIGCHLD信号来回收子进程 while (1) { sleep(10); // 模拟父进程工作 printf(Parent process is still running\n); } } return 0; }父进程设置了SIGCHLD信号的处理函数handle_sigchld该函数会在子进程状态改变时被调用。在处理函数中父进程使用waitpid()函数来回收子进程的资源 随着我们对Linux中信号保存与处理机制的深入探讨我们不难发现信号不仅是进程间通信的一种重要手段更是Linux操作系统内核提供的一种强大而灵活的控制机制。通过信号的捕获、保存、处理以及恢复我们可以实现对进程行为的精确控制从而满足各种复杂的系统需求 在本文的学习过程中我们共同经历了从信号的基本概念到高级应用的逐步深入见证了信号处理在Linux编程中的广泛应用和重要作用。我们不仅掌握了信号的捕获和处理技巧还学会了如何在实际开发中灵活运用这些技巧来解决实际问题 学习之路永无止境。虽然我们已经对Linux中的信号机制有了较为深入的了解但仍有许多未知和待探索的领域等待我们去发现。例如信号的实时性、优先级以及信号与线程的关系等高级话题都是值得我们进一步学习和研究的 我相信通过我们的共同努力和不断学习你一定能够在Linux编程的道路上越走越远取得更加辉煌的成就不断探索和学习新的领域不断提升自己的编程能力和技术水平! 希望本文能够为你提供有益的参考和启示让我们一起在编程的道路上不断前行 谢谢大家支持本篇到这里就结束了祝大家天天开心
http://www.w-s-a.com/news/215695/

相关文章:

  • 官方网站包括哪几个网站泰安的网站建设公司哪家好
  • 域名虚拟服务器做网站如何搭建企业网站
  • 用手机做网站服务器口碑好的常州网站建设
  • 摄影网站的设计与实现开题报告太原企业自助建站
  • 做如美团式网站要多少钱做网站怎么去文化局备案
  • 桂平市住房和城乡建设局网站网站建设与管理自考题
  • 怎么做公司网站制作凡科官方网
  • 达人设计网官方网站建筑效果图网站有哪些
  • 网站定制哪家快建筑室内设计网
  • 网站创建方案论文旅游网站的设计与制作html
  • 网站建设的数据导入导出开发小程序需要多少钱费用
  • 局网站建设进入前十名wordpress user role editor
  • 网站托管如何收费搜一下百度
  • 中国建设劳动协会网站wordpress 区块链媒体
  • 网站开源是什么意思西安做网站科技有限公司
  • 自己怎么用h5做网站肇庆seo
  • 长沙网站seo优化公司东莞企业官方网站建设
  • 网站个人备案材料北京网站推广价格
  • 百度做任务的网站电子工程网网站
  • 中介订制网站开发玉溪网站建设设计
  • 免费网站免费无遮挡手机页面设计软件
  • 网站建设需求规格说明书中山模板建站公司
  • wordpress get值网站建设 seo sem
  • 网站建设微信开发工厂代加工平台
  • 厦门 网站建设 公司哪家好asp.net 创建网站
  • 专业北京网站建设凡科网做网站怎么样
  • 金富通青岛建设工程有限公司网站浙江省住建厅四库一平台
  • 有搜索引擎作弊的网站企业建设H5响应式网站的5大好处6
  • 是做网站编辑还是做平面设计seo外包公司接单
  • 做性的网站有哪些苏州专业网站设计制作公司