我正在研究C中一个非常基本的UNIX shell。在这个项目中,我试图使用fork()
和execvp()
来执行实际的shell命令。我遇到了一个问题,它似乎可以使用具有单个参数的命令(例如ls -l
和echo howareyoutoday
完美地工作),但具有多个参数的命令无法执行({ {1}}没有运行)。我将引导您完成我的代码/基本原理,以帮助找出导致此问题的原因。
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
来电的token
已分配给strtok
。生成新的argv[0]
并将其添加到下一个token
元素中。对剩余的令牌重复该过程。
完成argv
数组后,将调用argv
,第一个参数包含命令名称,第二个参数包含整个execvp
数组。如果命令执行失败,将返回argv
并显示一条消息,表明将打印该文件。
我无法弄清楚为什么我遇到上面提到的多个参数问题。任何帮助或建议将不胜感激!
作为参考,完整程序的代码如下:
execvp
答案 0 :(得分:1)
您需要将参数字符串终止为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);
}
}