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

教做美食的网站网页设计html代码大全python

教做美食的网站,网页设计html代码大全python,要给公司做一个网站怎么做,网站开发任务单百度文库因为笔者之前的文章里面有错误#xff0c;今天发现#xff0c;立马做个修改。在下面我的一段关于sigchld信号相对于直接调用wait函数的好处时#xff0c;我说调用wait函数要一直检测子进程是否执行完其实是错误的#xff0c; wait是阻塞函数#xff0c;当主进程调用wait函…因为笔者之前的文章里面有错误今天发现立马做个修改。在下面我的一段关于sigchld信号相对于直接调用wait函数的好处时我说调用wait函数要一直检测子进程是否执行完其实是错误的 wait是阻塞函数当主进程调用wait函数的时主进程处于阻塞状态并没有一直检测的动作他只是在等待假设我们有三个子进程编号123假设23进程先执行完然而1号子进程还没有执行完那么主进程的wait就一直处于阻塞状态这时候23可能产生僵尸进程。这里sigchld和wait的区别就很明显了。 先来看看信号的基本概念 信号kill-l查看linux信号及其宏定义编号其中1~31非实时编号发送的信号可能丢失不支持信号排队31~64实时信号发送的信号都会被接收支持信号排队 信号的定义在/usr/include/bits/signum.h 1.信号是软件中断 2.信号是异步信号 3.信号的来源 (1)、硬件来源主要是硬件的驱动产生如键盘鼠标等 (2)、软件来源:主要是一些信号函数、比如kill()、raise()、alarm()、setitimer()等函数软件来源包括一些非法运算等操作软件设置条件(gdb调试)信号由内核产生 #信号的处理 进程会采取三种方式响应和处理信号 1.忽略信号sigkill和sigstop永远不被忽略忽略硬件异常、进程启动时sigusr1和sigusr2被忽略 2.执行默认操作 3.捕获信号。告诉内核信号出现时调用自己的处理函数SIGKILL和SIGSTOP不能被捕获 #信号登记 void(*signal(int signo,void (*func)(int))(int) signo--要登记的信号编号或者信号宏 func--信号处理函数指针、忽略信号SIG_IGN、默认信号(SIG_DEF) 今天我就不针对每个信号详细介绍了你也没必要知道那么多信号今天介绍一个很重要的信号SIGCHLD这个信号的作用如下 SIGCHLD 子进程状态发生变化产生该信号子进程运行结束父进程调用wait函数回收子进程的进程表项task_struct结构体。有了这个信号父进程不需要处于阻塞状态任然可以干其他事情当子进程结束时发送一个SIGCHLD信号给父进程父进程调用wait回收子进程避免僵尸进程的产生提高了资源利用率。 再了解这个信号之前先来简单了解一下wait函数 pid_t wait(int *status)//状态 unistd.h sys/wait.h 等待子进程退出并回收防止僵尸进程子进程运行结束但是内核中的task_struct没有释放产生凡是调用wait()就会阻塞父进程等待定时检查子进程是否执行完毕 返回子进程id pid_t waitpid(pid_t pid, int *status, int options); 成功返回子进程id这是wait的非阻塞版本。 wait和waitpid区别: 1.在一个子进程终止前wait使调用者阻塞 2.waitpid有一个选择项可以使调用者不阻塞 3。waitpid可以等待指定的一个子进程wait等待所有的子进程返回任意一个种植的子进程状态。 子进程在运行中有暂停信号如果想要显示暂停信号的信号码不能使用wait()要用waitpid() waitpid的宏WNOHANG(非阻塞)WUNTRACED(监听信号) 我们处理僵尸进程有两种方式 1.kill -9 父进程 让init进程回收僵尸进程 2.wait() 和 waitpid()让父进程等待回收子进程 下面我们来使用信号实现解决和避免僵尸进程的第三种的方式 [cpp] view plain copy #includestdio.h  #includestdlib.h  #includesys/wait.h  #includesignal.h  void sig_handler(int signo)  {      printf(child process  %d stop\n, signo);    }  void out(int n)  {      for(int i  0; i  n; i)      {          printf(%d out %d\n, getpid(), i);          sleep(1);      }  }  int main(void)  {      if(signal(SIGCHLD, sig_handler)  SIG_ERR)      {          perror(sigchld error);          exit(1);      }      pid_t pid  fork();      if(pid  0)      {          perror(fork error);          exit(1);      }      else if(pid  0)      {          out(100);      }      else      {          out(20);      }      return 0;  }  这段代码使用signal系统调用来捕获信号我们在signal里面注册了SIGCHLD信号程序中我们让子进程现执行完然后捕获子进程执行完毕的信号。 下面是运行结果部分截图 这里进程pid3546为父进程3547为子进程 我们再次运行程序来观察程序的运行状态把程序编译gcc signal_sigchld.c -o child 运行程序./child 使用命令ps -aux|grep child 来观察程序运行状态下面是结果截图 你可以看到父子进程在子进程运行到20以前都处于S即运行状态当子进程到达20的时候signal捕获到子进程退出的信号SIGCHLD 这时候子进程状态变为Z即僵尸进程。 所以我们说了那么多为什么SIGCHLD没有处理这个僵尸进程呢这里我们要搞清楚SIGCHLD只是子进程在运行结束的时候产生的一i个信号我们要想处理这个僵尸状态还是要用到上面说的两种方式。最好就是父进程调用wait(),你可能有要问既然都要用到wait那抹干吗多此一举使用信号呢首先要知道父进程调用wait以后处于阻塞状态父进程不能干其他事情使用效率降低资源利用率低下增加了开销而调用信号以后当子进程执行完毕以后自动产再生一个信号给父进程父进程收到信号以后就调用wait挥手子进程没有释放的资源。这样我的感觉就是子进程化被动为主动。父进程的工作也轻松了不少可以做自己想做的事情。 所以为了避免僵尸进程的产生我们修改上面的代码中的sig_handler函数如下 [cpp] view plain copy void sig_handler(int signo)  {      printf(child process  %d stop\n, signo);      wait(0);  }   当父进程捕获到SIGCHLD后调用wait。 按照上述步骤重新编译运行用ps观察进程运行状态 上面是子进程运行到20之前下面看子进程运行完毕父进程捕获到SIGCHLD以后 这里你发现子进程没有显示是因为紫禁城已经被回收释放掉了。 这就是处理僵尸进程的第三种方式。 也是一种异步处理方式。
http://www.yutouwan.com/news/180498/

相关文章:

  • 南京网站关键词优化咨询坑梓做网站公司怎么样
  • 做网站开发需要培训吗网站建设中目录
  • 本地东莞网站建设wordpress翻译了 mo无效
  • 做塑料的网站名字浙江城建建设集团网站
  • wordpress 站内资讯免费文件外链网站
  • 做网站有哪些住房与城乡建设部网站注册中心
  • 广东网站备案 时间做网站上传图片多大合适
  • js实现网站简体转繁体网站设计与建设课后题答案
  • 企业如何做好网站运营管理海外房产网站建设
  • 百度网站建设基本情况怎么提高网站的权重
  • 戴尔网站建设成功wordpress 机制
  • 中国有多少家做外贸网站设计的公司wordpress首页404伪静态
  • 要建设一个网站需要什么时候开始网站架构设计招聘
  • 企业网站导航菜单免费的大数据分析平台
  • wordpress前台文章增加编辑器关键词优化是怎么做的
  • 网站运营管理方案网站开发敲代码
  • 沈阳网站排名公司网站建站套餐
  • 网站视听内容建设西大路网站建设公司
  • 商城网站布局今天汽油价格
  • 泉州网站设计招聘网做收集信息的网站
  • 网站建设与管理期末试卷重庆市工程造价信息价查询
  • 厦门建设管理局网站西安网络建站
  • 任务发布网站建设教学网站前台模板
  • 建一个网站大约需要花费多少钱vps网站管理助手下载
  • html网站模板免费下载企业移动网站制作
  • 网站开发工程师代码如何提高网站响应速度
  • 企业标准网站模板莱芜
  • 网站规范化建设微信分享网站短链接怎么做的
  • 淘宝店铺网站建设周期购那个网站做的比较好
  • 关于网站设计的价格施工企业总工程师述职报告