尝试将 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
和可执行文件路径的绝对部分。
晚上好
我发现了一些类似的问题,但没有满足这个特定问题的要求。
我正在分叉一个子进程,并试图调用 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
和可执行文件路径的绝对部分。