经常使用的PCNTL函数
1. pcntl_alarm ( int $seconds )
设置一个$seconds秒后发送SIGALRM信号的计数器
2. pcntl_signal ( int $signo , callback $handler [, bool $restart_syscalls ] )
为$signo设置一个处理该信号的回调函数。下面是一个隔5秒发送一个SIGALRM信号,并由signal_handler函数获取,而后打印一个“Caught SIGALRM”的例子:
3. pcntl_exec ( string $path [, array $args [, array $envs ]] )
在当前的进程空间中执行指定程序,相似于c中的exec族函数。所谓当前空间,即载入指定程序的代码覆盖掉当前进程的空间,执行完该程序进程即结束。
4. pcntl_fork ( void )
为当前进程建立一个子进程,而且先运行父进程,返回的是子进程的PID,确定大于零。在父进程的代码中能够用 pcntl_wait(&$status)暂停父进程知道他的子进程有返回值。注意:父进程的阻塞同时会阻塞子进程。可是父进程的结束不影响子进 程的运行。
父进程运行完了会接着运行子进程,这时子进程会从执行pcntl_fork()的那条语句开始执行(包括此函数),可是此时它返回的是零(表明这是一个子 进程)。在子进程的代码块中最好有exit语句,即执行完子进程后当即就结束。不然它会又重头开始执行这个脚本的某些部分。
注意两点:
1. 子进程最好有一个exit;语句,防止没必要要的出错;
2. pcntl_fork间最好不要有其它语句,例如:
5. pcntl_wait ( int &$status [, int $options ] )
阻塞当前进程,只到当前进程的一个子进程退出或者收到一个结束当前进程的信号。使用$status返回子进程的状态码,并能够指定第二个参数来讲明是否以阻塞状态调用:
1. 阻塞方式调用的,函数返回值为子进程的pid,若是没有子进程返回值为-1;
2. 非阻塞方式调用,函数还能够在有子进程在运行但没有结束的子进程时返回0。
6. pcntl_waitpid ( int $pid , int &$status [, int $options ] )
功能同pcntl_wait,区别为waitpid为等待指定pid的子进程。当pid为-1时pcntl_waitpid与pcntl_wait 同样。在pcntl_wait和pcntl_waitpid两个函数中的$status中存了子进程的状态信息,这个参数能够用于 pcntl_wifexited、pcntl_wifstopped、pcntl_wifsignaled、pcntl_wexitstatus、 pcntl_wtermsig、pcntl_wstopsig、pcntl_waitpid这些函数。
子进程在输出child process等字样以后sleep了2秒才结束,而父进程阻塞着直到子进程退出以后才继续运行。
7. pcntl_getpriority ([ int $pid [, int $process_identifier ]] )
取得进程的优先级,即nice值,默认为0,在个人测试环境的linux中(CentOS release 5.2 (Final)),优先级为-20到19,-20为优先级最高,19为最低。(手册中为-20到20)。
8. pcntl_setpriority ( int $priority [, int $pid [, int $process_identifier ]] )
设置进程的优先级。
9. posix_kill
能够给进程发送信号
一个进程在调用exit命令结束本身的生命的时候,其实它并无真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit, 它的做用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其彻底销毁)。在Linux进程的状态中,僵尸进程是很是特殊的一种,它 已经放弃了几乎全部内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其余进程收集,除此以外, 僵尸进程再也不占有任何内存空间。它须要它的父进程来为它收尸,若是他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进 程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,若是这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它仍是能被清除的。 可是若是若是父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为何系统中有时会有不少的僵尸进程。 任何一个子进程(init除外)在exit()以后,并不是立刻就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。这是每一个 子进程在结束时都要通过的阶段。若是子进程在exit()以后,父进程没有来得及处理,这时用ps命令就能看到子进程的状态是”Z”。若是父进程能及时 处理,可能用ps命令就来不及看到子进程的僵尸状态,但这并不等于子进程不通过僵尸状态。