欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

linuxphp进程进阶(四)exec

时间:2023-07-20
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<?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 函数后面的代码行不会再执行

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。