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

平台搭建阳光房是否违章建筑上海官网seo

平台搭建阳光房是否违章建筑,上海官网seo,网站怎么做权重,自己做网站推广在那个网站信号Ⅲ 🔗 接上篇七、可重入函数八、volatile 关键字九、SIGCHLD 信号 🔗 接上篇 👉🔗进程信号篇Ⅰ:信号的产生(signal、kill、raise、abort、alarm)、信号的保存(core dump&#x…

信号Ⅲ

  • 🔗 接上篇
  • 七、可重入函数
  • 八、volatile 关键字
  • 九、SIGCHLD 信号


🔗 接上篇

👉🔗进程信号篇Ⅰ:信号的产生(signal、kill、raise、abort、alarm)、信号的保存(core dump)

👉🔗进程信号篇Ⅱ:信号的阻塞及保存(sigset_t, sigprocmask, sigpending)、信号的处理、信号的捕捉(sigaction)


七、可重入函数

不同的执行流中,同一个函数被重复进入。

有的函数,在功能上,重新进入后会产生我们不想看到的结果,这样的函数叫 不可重入函数。

对于没有重入问题的函数,我们叫做 可重入函数(Reentrant)

例如:insert 函数被不同的控制流程调用,有可能在第一次调用还没返回时就再次进入该函数,这称为重入。
insert 函数访问一个全局链表,有可能因为重入而造成错乱。两个不同的控制流程 调用同一个函数 访问它的 **同一个局部变量或参数**,就是可重入的。

如果一个函数符合以下条件之一则是不可重入的:

  • 调用了 malloc 或 free,因为 malloc 也是用全局链表来管理堆的。

  • 调用了标准 I/O 库函数。标准 I/O 库的很多实现都以不可重入的方式使用全局数据结构。


八、volatile 关键字

volatile 这个关键字,可以声明,让编译器每次都去内存中读取数据,可以保证内存的可见性。

#include <stdio.h>
#include <signal.h>/*volatile*/ int quit = 0;	// 保证内存可见性void handler(int signo)
{printf("change quit from 0 to 1\n");quit = 1;printf("quit: %d\n", quit);
}int main()
{signal(2, handler);while(!quit); // 这里不携带代码块,故意让编译器认为在 main 中,quit 只做检测作用printf("main quit 正常\n");return 0;
}

在一些编译版本下,如此叫 while 不挟带代码块,可以让编译器对 只用作检测的 quit 做优化。原本每次都要从内存中 load 进 cpu 的寄存器中再进行判断计算,优化后,编译器认为 quit 只是检测用的,便直接把 quit 的值 load 进寄存器后每次直接从寄存器中读取数据。这种优化就导致了内存不可见。

对上述代码 quit 进行 volatile 声明,就表示,要求编译器每次都要从内存里去重新读取数据。不让直接使用寄存器中的数据,保证内存数据可见。

九、SIGCHLD 信号

进程一章讲过用 wait 和 waitpid 函数清理僵尸进程,父进程可以阻塞等待子进程结束,也可以非阻塞地查询是否有子进程结束等待清理(也就是轮询的方式)。

采用第一种方式,父进程阻塞了就不能处理自己的工作了;采用第二种方式,父进程在处理自己的工作的同时还要记得时不时地轮询一下,程序实现复杂。

其实,子进程在终止时会给父进程发 SIGCHLD 信号,该信号的默认处理动作是 忽略,父进程可以自定义 SIGCHLD 信号的处理函数,这样父进程只需专心处理自己的工作,不必关心子进程了,子进程终止时会通知父进程,父进程在信号处理函数中调用 waitpid 清理子进程即可。

🌰代码举例:父进程 fork 出子进程,子进程调用 exit(1) 终止,父进程自定义 SIGCHLD 信号的处理函数,在其中调用 wait 获得子进程的退出状态并打印。

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/wait.h>pid_t id;void waitprocess(int signo)
{printf("我:%d ,捕捉到一个信号:%d\n",getpid(),signo);sleep(5);	// 这期间,子进程将处于 僵尸状态// 实现:只将部分退出的回收,没有退出需求的不处理while(1){											// 如果 WNOHANG 位置填 0,会导致,遇到没有退出的子进程时,就 hang 住了,没法往下继续运行// WNOHANG 意在,有的话给退出,没有的话就返回pid_t res = waitpid(-1, NULL, WNOHANG);	// -1 代表回收任意一个子进程if(res > 0){printf("wait success,res: %d, id: %d\n", res, id);}else break;	// 如果没有子进程了就 break}printf("handler done...\n");
}int main()
{signal(SIGCHLD, waitprocess);int i = 1;for(; i <= 10; i++){id = fork();if(id == 0){int count = 5;while(count){printf("我是子进程,我的 pid:%d,ppid:%d\n", getpid(), getppid());sleep(1);count--;}exit(1);}}while(1){sleep(1);}return 0;
}
如果父进程没啥事要干,可以在下面 waitpid
如果父进程很忙,而且不退出,可以选择信号的方式

事实上,由于 UNIX 的历史原因,要想不产生僵尸进程还有另外一种办法:父进程调用 sigactionSIGCHLD 的处理动作置为 SIG_IGN,这样 fork 出来的子进程在终止时会自动清理掉,不会产生僵尸进程,也不会通知父进程。

系统默认的忽略动作和用户用 sigaction 函数自定义的忽略通常是没有区别的,但 这是一个特例。此方法对于 Linux 可用,但不保证在其它 UNIX 系统上都可用。

🌰总之,上面的代码可以改写成这样:

int main()
{//signal(SIGCHLD, waitprocess);sigaction(SIGCHLD, SIG_IGN);int i = 1;for(; i <= 10; i++){id = fork();if(id == 0){int count = 5;while(count){printf("我是子进程,我的 pid:%d,ppid:%d\n", getpid(), getppid());sleep(1);count--;}exit(1);}}while(1){sleep(1);}return 0;
}

🥰如果本文对你有些帮助,请给个赞或收藏,你的支持是对作者大大莫大的鼓励!!(✿◡‿◡) 欢迎评论留言~~


http://www.wangmingla.cn/news/116247.html

相关文章:

  • 怎么做淘宝网站赚钱技巧软文发稿网
  • 网站 asp.net php做网页怎么做
  • 网站运营者网址关键字搜索引擎
  • 企业网站建设开题报告网站群发推广软件
  • 中职计算机网站建设教学计划十大网站平台
  • 免费微信网站建设怎么在网络上推广
  • 镇江制作网页图片seo搜索引擎优化工资多少钱
  • 网站建设首页包括什么软件百度推广关键词质量度
  • 景观设计师做交通分析常用网站百度首页广告多少钱
  • 网站商城设计方案怎么在平台上做推广
  • 制作付费下载网站营销策略理论
  • 建立自己的网站郑州关键词排名顾问
  • 典型的c2c平台有哪些seo推广网络
  • 建立网站的价格国家职业技能培训平台
  • 怎么架设一个网站湖南省人民政府
  • wordpress主题网站360优化大师官方下载最新版
  • 巴中做网站 微信开发中国十大互联网公司
  • 有哪些做调查问卷赚钱的网站现在比较好的营销平台
  • 门户网站免费建站可以搜任何网站的浏览器
  • 网站建设销售模式人工智能的关键词
  • 重庆那些公司的网站是网易做的seo关键词优化排名软件
  • 网站建设 开发百度搜索引擎竞价排名
  • 工厂 电商网站建设安卓手机优化软件哪个好
  • 北京都有那些做网站的公司搜索引擎营销的优势和劣势
  • 济南公司网站排名优化快速
  • 网站备案 新闻审批号国家优化防控措施
  • 网站开发外包合同范本长沙本地推广
  • 做一网站优化要多少钱电商平台排行榜前十名
  • 网站怎么做seo收录兰州网络推广与营销
  • 公司网站开发费怎么入账广东优化疫情防控措施