试图调用execvp以运行通过stdin提供的程序名,但每次调用都失败

试图调用execvp以运行通过stdin提供的程序名,但每次调用都失败,c,fork,parent-child,execvp,C,Fork,Parent Child,Execvp,晚上好 我发现了一些类似的问题,但基于这个具体问题,没有什么是足够的 我正在派生一个子进程,并试图调用execvp来运行一个简单的程序,该程序向stdout输出3个字符。要运行的程序名来自用户输入 出于某些原因,simpleO对execvp的每次调用都会失败: 我将文件simpleO.c编译成simpleO,然后编译并运行fork.c。当请求尝试运行时,我在提示符中键入simpleO,但每次都会出现错误。这是代码 perror打印的错误消息为“无此类文件或目录” -- 叉子 #include &

晚上好

我发现了一些类似的问题,但基于这个具体问题,没有什么是足够的

我正在派生一个子进程,并试图调用execvp来运行一个简单的程序,该程序向stdout输出3个字符。要运行的程序名来自用户输入

出于某些原因,simpleO对execvp的每次调用都会失败:

我将文件simpleO.c编译成simpleO,然后编译并运行fork.c。当请求尝试运行时,我在提示符中键入simpleO,但每次都会出现错误。这是代码

perror打印的错误消息为“无此类文件或目录”

--

叉子

#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] != '\0') {/*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;
}
#包括
#include/*fork,exec*/
#包括/*错误号*/
#包括/*strerror*/
#包括/*退出故障*/
#定义缓冲区大小100
int main(int argc,char*argv[]){
int i=0;
pid_t pid;
智力状态;
字符缓冲区[BUFFERSIZE];
fgets(缓冲区、缓冲区大小、标准输入);
argv[0]=strtok(缓冲区“”);
while(buffer[i]!='\0'){/*分析每个字符*/
if(buffer[i]='')/*基于有多少个空格*/
argv[i]=strtok(NULL,“”;/*标记化,填充argv*/
i++;
}  
如果((pid=fork())=-1){
fprintf(stderr,“fork错误:%s\n”,strerror(errno));
返回退出失败;}
否则如果(pid==0){
int e=execvp(argv[0],argv);
如果(e==-1){
perror(“执行失败”);
printf(“进程%s\n”,argv[0]);
perror(“进程未运行”);
出口(1);
}
}
否则{
等待(&状态);}
返回0;
}
--

simpleO.c

#include <stdio.h>
int main(int argc, char **argv){
    printf("%c",'c');
    printf("%c",'2');
    printf("%c",'1');
return 0;
}
#包括
int main(int argc,字符**argv){
printf(“%c”,“c”);
printf(“%c”,“2”);
printf(“%c”,“1”);
返回0;
}

Addl ref:perror打印“没有这样的文件或目录”

好吧,看:编程中的一个关键教训是,当错误消息告诉你一些事情时,你应该相信它。因此,您的程序会说“没有这样的文件或目录”,这意味着您尝试运行的文件在您尝试使用的任何路径上都不存在


现在您知道它不是默认路径,所以接下来要尝试的是使用可执行文件的绝对路径。现在,考虑到剩下的内容,我建议您编写一个非常简单的C程序,除了尝试fork/exec您的子程序之外,它什么都不做。没有
argv
vector或任何东西,只需
fork
然后
execvp
在可执行路径为绝对部分的子对象中执行即可。

键入时也会出现相同的问题。peror打印的消息,以便我们这些没有精神力量的人可以看到您看到的内容。为麻瓜扫描更新请确保您的代码在发帖<例如,代码>指针数组\u是未声明的。更新是因为我是麻瓜,忘记删除指针数组\u宾果!现在你知道问题了。下面是您的下一步:使用
getcwd()
,找出真正的当前目录是什么。然后,您可以使用
setcwd()
更改为您认为当前目录应该是的目录,或者您可以找出如何计算适当的路径而无需对其进行硬编码。啊,然后将strcat/programname放在绝对路径的末尾?感谢您的回复,顺便说一句,“编程中的一个关键课程是,当错误消息告诉您一些事情时,您应该相信它。”我将让我的学生背诵这些内容,并在每节课的开始和结束时背诵……哇,我想我找到了它。在我的缓冲区的末尾有一个新行(来自fgets()),它正在扭曲绝对路径。非常感谢查理!“编程中的一个关键教训是,当错误消息告诉你一些事情时,你应该相信它。”的确如此。只需删除绝对路径末尾的/即可。哦!