php重启 本质上是调用 php
execvp("/usr/local/php/sbin/php-fpm");c#
execvp就是用一个新的进程把本身替换掉,一个进程一旦调用exec类函数,它自己就"死亡"了,系统把代码段替换成新的程序的代码,废弃原有的数据段和堆栈段,并为新程序分配新的数据段与堆栈段,惟一留下的,就是进程号,也就是说,对系统而言,仍是同一个进程,不过已是另外一个程序了。(不过exec类函数中有的还容许继承环境变量之类的信息。1>exec()函数调用并无生成新进程,一个进程一旦调用exec函数,它本省就“死亡了”--就比如被鬼上身同样,身体仍是你的,但灵魂和思想已经被替换了 --系统把代码段替换成新的程序的代码,废弃原有的数据段和堆栈段,并为新程序分配新的数据段与堆栈段,惟一保留的就是进程ID。也就是说,对系统而言,仍是同一个进程,不过执行的已是另一个程序了函数
#include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> char command[256]; void main() { int rtn; while(1) { printf( ">" ); fgets( command, 256, stdin ); command[strlen(command)-1] = 0; execlp( command, NULL ); printf("execute done\n"); perror( command ); exit( errno ); } }
gcc -o execvp execvp.cphp-fpm
./execvpspa
>code
此时blog
root@taek:~# ps aux|grep execvp继承
root 6158 0.0 0.0 4084 692 pts/2 S+ 14:58 0:00 ./execvp进程
root 6160 0.0 0.1 12700 1780 pts/3 S+ 14:58 0:00 grep execvpget
root@taek:/home/study_c# ./execvp
>./execvp
>
root@taek:~# ps aux|grep execvp
root 6158 0.0 0.0 4084 640 pts/2 S+ 14:58 0:00 [execvp]
root 6162 0.0 0.0 3028 264 pts/3 R+ 14:58 0:00 grep execvp
会发现执行execvp的进程号没有变