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

东高端莞商城网站建设有没有专门找装修公司的网站

东高端莞商城网站建设,有没有专门找装修公司的网站,discuz做服务网站,网页设计入门+齿轮https://blog.csdn.net/lyztyycode/article/details/78150805SIGCHLD(修改)因为笔者之前的文章里面有错误#xff0c;今天发现#xff0c;立马做个修改。在下面我的一段关于sigchld信号相对于直接调用wait函数的好处时#xff0c;我说调用wait函数要一直检测子进程是否执行完…https://blog.csdn.net/lyztyycode/article/details/78150805SIGCHLD(修改) 因为笔者之前的文章里面有错误今天发现立马做个修改。在下面我的一段关于sigchld信号相对于直接调用wait函数的好处时我说调用wait函数要一直检测子进程是否执行完其实是错误的 wait是阻塞函数当主进程调用wait函数的时主进程处于阻塞状态并没有一直检测的动作他只是在等待假设我们有三个子进程编号123假设23进程先执行完然而1号子进程还没有执行完那么主进程的wait就一直处于阻塞状态这时候23可能产生僵尸进程。这里sigchld和wait的区别就很明显了。先来看看信号的基本概念信号kill-l查看linux信号及其宏定义编号其中1~31非实时编号发送的信号可能丢失不支持信号排队31~64实时信号发送的信号都会被接收支持信号排队信号的定义在/usr/include/bits/signum.h1.信号是软件中断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.hsys/wait.h等待子进程退出并回收防止僵尸进程子进程运行结束但是内核中的task_struct没有释放产生凡是调用wait()就会阻塞父进程等待定时检查子进程是否执行完毕返回子进程idpid_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 plaincopy#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 plaincopyvoid sig_handler(int signo)  {      printf(child process  %d stop\n, signo);      wait(0);  }  当父进程捕获到SIGCHLD后调用wait。按照上述步骤重新编译运行用ps观察进程运行状态上面是子进程运行到20之前下面看子进程运行完毕父进程捕获到SIGCHLD以后这里你发现子进程没有显示是因为紫禁城已经被回收释放掉了。这就是处理僵尸进程的第三种方式。也是一种异步处理方式。
http://www.pierceye.com/news/281517/

相关文章:

  • 外贸网站做SEO电脑浏览器打不开网页是什么原因
  • 做网站需要下载啥google建站推广
  • 沈阳哪里有教做网站的会做网站怎么赚钱
  • iis如何做同时运行两个网站80端口做汽车网站费用
  • 网站规划与设计一千字网红营销模式
  • 西安 域名空间网站制作淘宝客网站主题下载
  • 网页制作与网站建设pdf网站开发前端和后端工作
  • 网站设计教学西安免费企业网站模板图片
  • 吉林省住房和城乡建设厅网站官网手机百度app免费下载
  • 微信开放平台网站应用营销网站建设的规则
  • 网站制作语言有哪些对接标准做好门户网站建设
  • asp 公司网站源码贵州省建设厅的网站
  • 企业网站备案资料样本自建网站要多少钱
  • 女生做网站推广常用的网站推广方法
  • 营销型网站建设公司哪家建设开封做网站公司汉狮
  • 烟台专业网站建设seo实战培训教程
  • 上海建设项目环保验收公示网站dw做网站首页长宽设置多少
  • 中山网站制作系统创意视差wordpress主题
  • 安康网站开发公司广州微网站建设哪家好
  • 网站建设企业官网源码被代运营骗了怎么追回
  • 网站服务器 重启用邮箱做网站
  • 网站建设修改建议书网站快速收录方法
  • 网站建设项目步骤网站空间可以换吗
  • 美食网站界面设计网页设计制作代码大全
  • 宁波网站建设托管网站正在建设维护中页面
  • 古色古香网站模板响应式布局网站
  • 网站建设制作设计开发福建网站开发文档撰写
  • 钢管公司网站建设国外平面设计欣赏网站
  • 网站建设如何销售济南专门做网站的公司
  • 2018年淘宝客网站怎么做iis网站建设中