gpt4 book ai didi

c - execvp 的错误地址错误

转载 作者:太空宇宙 更新时间:2023-11-04 06:17:25 24 4
gpt4 key购买 nike

我正在尝试制作一个 shell“bosh>”,它接受 Unix 命令并不断收到错误的地址错误。我知道我的代码读取命令并解析它们,但出于某种原因,我无法让它们执行,相反,我收到“错误地址”错误。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <string.h>
#include <sys/wait.h>
#define MAX_LINE 128
#define MAX_ARGS 10



int main(){
pid_t pid;
char command[MAX_LINE]; /*command line buffer*/
char *commandArgs[MAX_ARGS]; /*command line arg*/
int i;
char *sPtr=strtok(command," ");
int n=0;


printf("bosh>");
fgets(command, MAX_LINE-1,stdin);
command[strlen(command)-1]='\0';


while(strcmp(command,"quit")!=0)
{
n=0;

sPtr=strtok(command," ");
while(sPtr&&n<MAX_ARGS)
{
sPtr=strtok(NULL," ");
n++;
}

commandArgs[0]=malloc(strlen(command)+1);
strcpy(commandArgs[0],command);

if(fork()==0)
{
execvp(commandArgs[0],commandArgs);
perror("execvp failed");
exit(2);
}
pid=wait(NULL);


printf("%s",">" );
fgets(command, MAX_LINE-1,stdin);
command[strlen(command)-1]='\0';
}

printf("Command (%d) done\n", pid);

return 0;


}

最佳答案

这两行是罪魁祸首:

commandArgs[0]=malloc(strlen(command)+1);
strcpy(commandArgs[0],command);

首先,malloc(strlen(...)) 后面跟着strcpy 就是POSIX函数strdup已经这样做了。但是,您甚至不需要复制字符串 - 只需将指向原始字符串的指针存储到 commandArgs[0] 中就足够了:

commandArgs[0] = command;

但是,execvp 怎么办?该命令将采用多少个参数?如果您仔细阅读手册,他们会这样说:

The execv(), execvp(), and execvpe() functions provide an array of pointers to null-terminated strings that represent the argument list available to the new program. The first argument, by convention, should point to the filename associated with the file being executed. The array of pointers MUST be terminated by a NULL pointer.

您的参数数组不是以 NULL 结尾的。要修复它,请使用

commandArgs[0] = command;
commandArgs[1] = NULL; // !!!!

(然后您会注意到您实际上想要在 strtok 解析循环中分配参数,这样您就可以将所有参数分配给commandArgs 数组;并在启用所有警告的情况下进行编译并解决这些警告,等等)。

关于c - execvp 的错误地址错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42540991/

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