execl: Permission denied 问题解决 && execl , vfork 应用

问题:验证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后,执行正确!

猜你喜欢

转载自blog.csdn.net/Penper_King/article/details/79122461
今日推荐