execvp php-fpm reload使用的函数

php重启 本质上是调用 

execvp("/usr/local/php/sbin/php-fpm");

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.c

./execvp

>

 

此时

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 execvp

 

 

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的进程号没有变

 

posted @ 2019-03-22 11:14  taek  阅读(407)  评论(0编辑  收藏  举报