gpt4 book ai didi

c - execvp 因多个参数或没有参数而失败

转载 作者:行者123 更新时间:2023-12-02 03:40:16 28 4
gpt4 key购买 nike

我正在使用 C 编写一个非常基本的 UNIX shell。在这个项目中,我试图使用 fork()execvp() 来执行实际的 shell命令。我遇到了一个问题,它似乎可以很好地处理具有单个参数的命令(例如 ls -lecho howareyoutoday 工作得很好),但是具有多个参数的命令无法执行(echo how are you today 未运行)。我将向您介绍我的代码/基本原理,以帮助找到此问题背后的原因。

                char *token;
int count=0;
pid_t childProc;
int childStatus;
pid_t tpid;
char* argv[256];
int i=1;

childProc = fork();

if (childProc==0) {
//CHILD PROCESS IS HERE
argv[0] = malloc(strlen(token));
argv[0] = token;

token=strtok(NULL," \n\t()<>|&;");
while(token!=NULL) {
argv[i]=malloc(strlen(token));
argv[i]=token;
token=strtok(NULL," \n\t()<>|&;");
i++;
}
execvp(argv[0],argv);

//if this executes execvp fails
printf("failure to execute\n");
i=0;
exit(0);
}
else {
//PARENT PROCESS IS HERE
do {
tpid = wait(&childStatus);
} while(tpid != childProc);
}

所以它从一个基本的 fork() 调用开始,以创建子进程。在该子进程中,我为 argv 数组中的第一个元素分配了内存。来自先前 strtok 调用的 token 被分配给 argv[0]。生成一个新的 token 并将其添加到下一个 argv 元素。对剩余的剩余 token 重复此过程。

argv 数组完成后,将调用 execvp,第一个参数包含命令名称,第二个参数是整个 argv数组。如果命令执行失败,execvp 将返回并打印一条消息指示。

我不明白为什么我会遇到上面提到的多参数问题。任何帮助或建议将不胜感激!

供引用,完整程序代码如下:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
char buffer[256];
char *token;
int count=0;
pid_t childProc;
int childStatus;
pid_t tpid;
char* argv[256];
int i=1;
int j=0;

while(1) {
fgets(buffer, 256, stdin);

token=strtok(buffer," \n\t()<>|&;");

while (token==NULL) {
fgets(buffer,256,stdin);
token=strtok(buffer," \n\t()<>|&;");
}

if (strcmp(token,"exit")==0) {
exit(0);
}
else if (strcmp(token,"cd")==0) {
token = strtok(NULL, " \n\t()<>|&;");

if (chdir(token)!=0) {
perror("Error: ");
}
}
else {
childProc = fork();

if (childProc==0) {
argv[0] = malloc(strlen(token));
argv[0] = token;

token=strtok(NULL," \n\t()<>|&;");
while(token!=NULL) {
argv[i]=malloc(strlen(token));
argv[i]=token;
token=strtok(NULL," \n\t()<>|&;");
i++;
}
execvp(argv[0],argv);

//if this executes execvp fails
printf("failure to execute\n");
i=0;
exit(0);
}
else {
do {
tpid = wait(&childStatus);
} while(tpid != childProc);
}
}
}
}

最佳答案

您需要以 null 终止您的参数字符串到 execvp

if (childProc == 0)
{
argv[0] = malloc(strlen(token));
argv[0] = token;

token = strtok(NULL, " \n\t()<>|&;");

while (token != NULL)
{
argv[i] = malloc(strlen(token));
argv[i] = token;
token = strtok(NULL, " \n\t()<>|&;");
i++;
}

argv[i] = NULL; //<--- insert here

if (execvp(argv[0], argv) == -1)
{
printf("failure to execute because %s\n", strerror(errno));
exit(0);
}
}

关于c - execvp 因多个参数或没有参数而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20461420/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com