首页 > 解决方案 > 为什么 execve 不启动进程?

问题描述

我为 uni 写了一个方法,它应该启动一个程序。我必须使用 execve。但它不起作用。例如,当我使用 execvp 而不是 execve 时,它​​可以工作并启动程序。

#include <stddef.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/wait.h>

pid_t run_command(char **argv, int no_fork){
    extern char **environ;
    pid_t pid;


    if(no_fork != 0){
        execve(*argv, argv, environ);
        return 0;
    }
    else{
        if((pid = fork()) < 0){
            printf("Error: fork!\n");
            return -1;
        }
        else if(pid == 0){

            argv++;

            printf("execve(%s)\n", *argv);
            execve(*argv, argv, environ);

        }
        else {                                  
            wait(NULL);
        }
    }
    return pid;
}

/*
int run_cmdline(char ** argv){
    return 0;
}*/

int main(int argc, char* argv[]){
    run_command(argv, 0);

    return 0;
}

编译:

clang -o 主 shell.c

例如执行:

./主火狐

应该启动火狐。使用 execvp 和没有 environ 它可以工作,但不能使用 execve。

感谢任何帮助:)

标签: cprocessfork

解决方案


execve(*argv, argv, 环境);

./主火狐

execve不搜索 PATH。您必须提供可执行文件的完整路径或自己解析路径。此行为的参考在posix中,但我觉得很难阅读,man execve对我来说看起来更容易。

所以像:

./main /usr/bin/firefox

应该工作,甚至:

./main /usr/bin/sh -c firefox

或者也许只是使用自动神奇地execvp获取“父级”environ并搜索路径。还有一个 linux 扩展execvpe,它不在 posix 中并且确实需要environ.


推荐阅读