问题:验证excel只执行程序,不启动新的进程(即验证一下execl执行前后的pid是否变化)
先贴code
main.C
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(void)
{
pid_t pid = vfork();
if (pid == 0)
{
printf("befor ececl : pid = %d\n", getpid());
execl("./","print_pid",NULL);
perror("execl");
exit(-1);
}
sleep(1);
printf("code end!\n");
return 0;
}
main.c用到了vfork函数,创建子进程,返回两次。一次 0 给子进程,一次子进程pid给父进程;
execl 执行print_pid可执行文件,执行成功的同时,父进程也开始运行,不过在父进程sleep。。。
执行完execl,即退出子进程,再也不进入子进程;
为了确保程序的完整性,我加入了错误判断perror,来验证execl错误原因;
另外,vfork创建的子进程,execl出错时,必须加exit(-1),避免死循环(此子进程只能通过exit或者execl组函数退出)
另外 用c编译生成了print_pid可执行文件,c文件如下
print_pid.c
#include <stdio.h>
#include <unistd.h>
int main(void)
{
printf("after execl :%d\n", getpid());
return 0;
}
敲人shell 指令:
gcc print_pid -o print_pid
gcc main.c
./a.out
屏幕打印
befor ececl : pid = 511
execl: Permission denied
code end!
将print_pid改成777还是没用,甚至用shell写的pid可执行文件依旧如上。查阅man(主要是百度)
可以发现上面写的很清楚,第一个参数需要指向可执行文件名,然而我写的文件所在路径,非常尴尬!!!
将./ 改成 ./print_pid后,执行正确!