首页 > 作文

php 中的信号处理操作实例详解

更新时间:2023-04-08 15:35:44 阅读: 评论:0

本文实例讲述了php 中的信号处理操作。分享给大家供大家参考,具体如下:

首先我们需要了解几个函数

pcntl_signal 安装信号处理器,也就是当指定信号发生时,调用函数。
pcntl_alarm 指定秒数后向进程发送sigalrm信号。
posix_getpid 返回当前进程id
posix_kill 给指定进程发送信号

一些常用的信号说明

sighup
本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时,
通知同一ssion内的各个作业, 这时它们与控制终端不再关联。

sigint
程序终止(interrupt)信号, 在用户键入intr字符(通常是ctrl-c)时发出。

sigquit
和sigint类似,但由quit字符(通常是ctrl-/)来控制;进程在因收到sigquit退出时会产生core文件,
在这个意义上类似于一个程序错误信号。

sigkill
用来立即结束程序的运行。本信号不能被阻塞、处理和忽略。如果管理员发现某个进程终止不了,可尝试发送这个信号。

sigterm
程序结束(terminate)信号, 与sigkill不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出,
shell命令kill缺省产生这个信号。如果进程终止不了,我们才会尝试sigkill。

sigusr1
留给用户使用

sigusr2
留给用户使用

sigalrm
时钟定时信号, 计算的是实际的时间或时钟时间。alarm函数使用该信号。

sigchld
子进程结束时, 父柚木梓马进程会收到这个信号。

例1:

<?phpdeclare(ticks = 1);//信号处理函数function sig_func() {  echo "child exit \r\n";}//设置信号处理器pcntl_signal(sigchld, 'sig_func');$pid = pcntl_fork();if($pid == -1) {  die('fork error');} el if ($pid) {  pcntl_wait($status);} el {  echo "child... \r\n";  exit;}

当子进程退出时,会向父进程发送sigchld信号,我们通过设置信号处理器,成功的处理信号。

例2:

<?phpdeclare(ticks = 1);//信号处理函数function sig_func($signo) {  switch($signo) {    ca sigchld: { 期末冲刺100分语文     echo "child sigchld \r\n";      break;    }    ca sigterm: {      echo "child sigterm \r\n";      break;    }    default:      //处理所有其他信号      break;  }}//设置信号处理器pcntl_signal(sigchld, 'sig_func');//设置信号处理器pcntl_signal(sigterm, 明朝灭亡时间'sig_func');$pid = pcntl_fork();if($pid == -1) {  die('fork error');} el if ($pid) {  pcntl_wait($status);} el {  sleep(3);  echo "child \r\n";  sleep(3);  posix_kill(getmypid(), sigterm);  exit;}

父进程等待子进程的退出,子进程等待3秒后输出child,再等待3秒后向自身发送结束程序信号。

例3:

<?平面设计论文phpdeclare(ticks = 1);//信号处理函数function sig_func($signo) {  switch($signo) {    ca sigchld: {      echo "child sigchld \r\n";      break;    }    /*这里要把处理sigterm信号的代码注释掉    ca sigterm: {      echo "child sigterm \r\n";      break;    }*/    default:      //处理所有其他信号      break;  }}//设置信号处理器pcntl_signal(sigchld, 'sig_func');//设置信号处理器,也注释掉//不然当父进程发向子进程发送sigterm信号时,子进程不会退出,还会继续执行//我们的信号处理函数把sigterm给忽略了//pcntl_signa中秋祝福词l(sigterm, 'sig_func');$pid = pcntl_fork();if($pid == -1) {  die('fork error');} el if ($pid) {  sleep(30);  posix_kill($pid, sigterm);} el {  $cnt = 0;  for(;;) {    sleep(3);    echo $cnt, '-';    ++$cnt;  }  exit;}

父进程在等待30秒后,向子进程发送sigterm结束程序信号。如果我们设置了sigterm信号的处理器,并且在自定义信号处理器中并没有杀死该进程,则该子进程会一直运行下去。

pcntl_signal()函数仅仅是注册信号和它的处理方法,真正接收到信号并调用其处理方法的是pcntl_signal_dispatch()函数。

例4:

<?php//使用ticks需要php 4.3.0以上版本//declare(ticks = 1);function sig_func() {  echo "sigalrm \r\n";}//设置信号处理器pcntl_signal(sigalrm, 'sig_func');pcntl_alarm(3);

通过函数pcntl_alarm()3秒后给进程发送sigalrm信号,但信号处理函数并未调用。
原因是我们注释了declare(ticks = 1);这段代码,而又没有调用pcntl_signal_dispatch()函数。

declare(ticks = 1);表示每执行一条低级指令,就检查一次信号,如果检测到注册的信号,就调用其信号处理器。但是这种处理方式效率很低,建议在代码循环中通过pcntl_signal_dispatch()来处理信号。

<?php//使用ticks需要php 4.3.0以上版本//declare(ticks = 1);function sig_func() {  echo "sigalrm \r\n";}//设置信号处理器pcntl_signal(sigalrm, 'sig_func');pcntl_alarm(3);//因为3秒后pcntl_alarm函数才会给进程发送sigalrm信号//所以我们通过sleep函数等待3秒后,调用pcntl_signal_dispatch()来处理信号sleep(3);pcntl_signal_dispatch();

pcntl_signal_dispatch()这个函数是php5.3以上才支持的,如果你的php版本大于5.3,建议使用这个方法调用信号处理器。
5.3以下的版本需要在注册信号之前加上:declare(ticks = 1);

本文发布于:2023-04-08 15:35:42,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/2fd6d31c5720e3a6983c709cb2f8d2f5.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:php 中的信号处理操作实例详解.doc

本文 PDF 下载地址:php 中的信号处理操作实例详解.pdf

标签:信号   进程   函数   处理器
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图