在php 使用 pcntl 进程扩展的 pcntl_exec 这个函数实现相同功能,它内部系统调用是 execveexec 一般的用法是父进程先创建一个子进程,然后子进程在调用这个函数
需要注意 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<?phpprint_r($argc.PHP_EOL);print_r($argv);print_r(getenv());
2、子进程调用exec函数后正文段(代码段)+ 数据段会被新程序替换,它的一些属性会继承父进程,PID 并没有发生变化
//exec2.php<?phpfunction 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<?phpfunction 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 函数后面的代码行不会再执行