linux exec 函数功能:用来执行一个程序
exec
一般的用法是父进程先创建一个子进程,然后子进程在调用这个函数
- 在php 使用 pcntl 进程扩展的 pcntl_exec 这个函数实现相同功能,它内部系统调用是
execve
- 需要注意 pcntl_exec 函数第一个参数必须是
可执行的二进制文件路径
,或是在文件第一行指定了 一个可执行文件路径标头的脚本(比如文件第一行是#!/usr/bin/php
的php脚本)
错误写法 pcntl_exec('demo.php',['a'],['b'])
- 第二个参数是命令行参数
- 第三个参数是环境参数
//exec.php
<?php
$pid = pcntl_fork();
if($pid == 0){
pcntl_exec("/usr/bin/php",['demo1.php','da','lei'],['b','c']);
}
pcntl_wait($status);
//demo1.php
<?php
print_r($argc.PHP_EOL);
print_r($argv);
print_r(getenv());
2. 子进程调用exec函数后正文段(代码段)+ 数据段会被新程序替换,它的一些属性会继承父进程,PID 并没有发生变化
//exec2.php
<?php
function show($str){
$pid = posix_getpid();
fprintf(STDOUT, "%s pid=%d, ppid=%d, gpid=%d, sid=%d, uid=%d, gid=%d \n",$str, $pid, posix_getppid(), posix_getpgrp(),posix_getsid($pid),posix_getuid(),posix_getgid());
}
show('父进程');
$pid = pcntl_fork();
if($pid == 0){
show('子进程');
pcntl_exec("/usr/bin/php",['demo2.php','da','lei'],['b','c']);
}
pcntl_wait($status);
//demo2.php
<?php
function show($str){
$pid = posix_getpid();
fprintf(STDOUT, "%s, pid=%d, ppid=%d, gpid=%d, sid=%d, uid=%d, gid=%d \n",$str, $pid, posix_getppid(), posix_getpgrp(),posix_getsid($pid),posix_getuid(),posix_getgid());
}
show('子进程2');
print_r($argc.PHP_EOL);
print_r($argv);
print_r(getenv());
3. pcntl_exec
函数后面的代码行不会再执行