尝试将 execvp 调用到通过标准输入提供的 运行 程序名,但每次调用都失败

Attempting to call execvp to run programname supplied through stdin, but call fails each time

晚上好

我发现了一些类似的问题,但没有满足这个特定问题的要求。

我正在分叉一个子进程,并试图调用 execvp 到 运行 一个简单的程序,该程序将 3 个字符输出到标准输出。程序名称运行来自用户输入。

出于某种原因,simpleO 对 execvp 的每次调用均失败:

我把文件simpleO.c编译成simpleO,然后再编译运行fork.c。当请求尝试 运行 时,我在提示中键入 simpleO,但每次我都收到错误。这是代码。

perror打印的错误信息是"No such file or directory"

--

fork.c

#include <stdio.h>
#include <unistd.h>/*fork, exec*/
#include <errno.h>/*errno*/
#include <string.h> /*strerror*/
#include <stdlib.h>/*EXIT_FAILURE*/

#define BUFFERSIZE 100

int main(int argc, char *argv[]){
int i = 0;
pid_t pid;
int status;
char buffer[BUFFERSIZE];

fgets(buffer, BUFFERSIZE, stdin);

argv[0] = strtok(buffer, " ");
while (buffer[i] != '[=11=]') {/*analyze each char*/
    if (buffer[i] == ' ')/*based on how many spaces there are*/
        argv[i] = strtok(NULL, " ");/*tokenize, populate argv*/
    i++;
}  

if((pid = fork()) == -1){
    fprintf(stderr, "fork error: %s\n", strerror(errno));
    return EXIT_FAILURE;}
else if (pid==0) {
    int e = execvp(argv[0],argv);
    if (e==-1) {
        perror("Exec failed");
        printf("Process %s\n",argv[0]);
        perror("Process did not run");
        exit(1);
    }
}
else{
    wait(&status);}
return 0;
}

--

simpleO.c

#include <stdio.h>
int main(int argc, char **argv){
    printf("%c",'c');
    printf("%c",'2');
    printf("%c",'1');
return 0;
}

Addl ref: perror prints "No such file or directory"

好的,看:编程的一个重要教训是,当错误消息告诉您某些事情时,您应该相信它。因此,您的程序显示 "no such file or directory",这意味着您尝试 运行 的文件在您尝试使用的任何路径中都不存在。

您现在知道它不在默认路径中,所以下一步要尝试使用可执行文件的绝对路径。现在,考虑到其余部分,我建议您编写一个非常简单的 C 程序,该程序除了尝试 fork/exec 您的 child 程序外什么都不做。没有 argv 向量或任何东西,只有 fork 然后 child 中的 execvp 和可执行文件路径的绝对部分。