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的進程號沒有變