我正在尝试使用系统调用进行基本的bash,但是我在指针数组方面遇到了一些小问题。
简要概括我的代码,我使用read()从stdin读取命令到缓冲区,然后使用strsep()将命令与参数以及所有参数分离成一个数组。然后我使用fork()创建一个新进程,并使用execvp()执行该命令和相关参数。
所有这些都进入一个无限循环,直到用户键入“quit”(尚未编码)。问题是,在第一次迭代之后,我需要*pArgs为空,以便进行下一个命令和参数。而我不知道该怎么做......
以下是我的代码:
简要概括我的代码,我使用read()从stdin读取命令到缓冲区,然后使用strsep()将命令与参数以及所有参数分离成一个数组。然后我使用fork()创建一个新进程,并使用execvp()执行该命令和相关参数。
所有这些都进入一个无限循环,直到用户键入“quit”(尚未编码)。问题是,在第一次迭代之后,我需要*pArgs为空,以便进行下一个命令和参数。而我不知道该怎么做......
以下是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char **argv) {
char bBuffer[BUFSIZ], *pArgs[10], *aPtr = NULL, *sPtr;
int aCount;
pid_t pid;
while(1) {
write(1, "\e[1;31mmyBash \e[1;32m# \e[0m", 27);
read(0, bBuffer, BUFSIZ);
sPtr = bBuffer;
aCount = 0;
do {
aPtr = strsep(&sPtr, " ");
pArgs[aCount++] = aPtr;
} while(aPtr);
pArgs[aCount-2][strlen(pArgs[aCount-2])-1] = '\0';
// Debug code to output pArgs content
write(1, "|>", 2);
write(1, pArgs[0], strlen(pArgs[0]));
write(1, "<|", 2);
if(strlen(pArgs[0]) > 1) {
pid = fork();
if(pid == -1) {
perror("fork");
exit(1);
}
if(pid == 0) {
execvp(pArgs[0], pArgs);
exit(0);
}
}
}
return 0;
}
P.S:很抱歉目前无法提供输入和输出测试用例。希望这不是太难理解和修复,您们不需要它。如果需要的话,我稍后会发布。
仅为澄清:
我知道我曾经询问如何清除数组,并且我得到了答案。但现在我明显意识到我的问题并不在于此,而是在于缓冲区收集的垃圾,正如litb所指出的。使用空字符终止字符串比清除数组更有意义。这就是为什么我将litb的答案标记为正确答案的原因。