【发布时间】:2014-01-26 21:52:08
【问题描述】:
我正在尝试在 C 中实现一个基本的 Unix Shell。我的程序将用户的命令存储在一个 char ** args 中。这是我的问题:
当我向用户询问命令时,例如 ls , ls 存储在 args[0] 中。然后我 fork 一个子进程并使用 execvp 执行命令。现在,下次用户输入另一个命令时,再次说 ls,它存储在 args[1] 中。所以我不能使用 execvp 执行这个命令。
我不想遍历数组以查找 ls 或 对于任何其他争论,因为那样程序将执行随机参数。
我需要一种方法来清空我的 args 以便我可以重写 args[1]。
int main() {
pid_t childPro;
pid_t parentPro;
int i,r,argCount,status,pipeCount,changeOut;
char **args;
while(1) {
argCount=0;
printf("davedShell$ ");
args = getln();
if(argCount>=1) {
//Creating a child process through fork
childPro =fork ();
if(childPro==0){
printf("Child Process: %d successfully created\n",(int) getpid());
execvp(args[0],args);
}
else if (childPro == -1) {
printf("Fork Failed- Exiting");
exit(1);
}
parentPro = wait(&status);
}
【问题讨论】:
-
为什么不处理掉当前的缓冲区?
-
能否详细说明?
-
“清空我的参数”是什么意思?为什么第二次从 1 开始而不是 0?这可能是
getln所做的问题。发布完整代码。事实上,你的问题没有意义。 -
不幸的是 getln() 是我的教授预定义的,我会尝试重新发布。但拿这个例子来说:如果我输入 ls,那么 ls 存储在 args[0] 中。然后 execvp[0] 将执行 ls。然后我回到循环。如果我再次输入 ls,那么系统将不会打印所需的输出,因为第二个 ls 存储在 args[1] 中,因此 execvp 无法正确执行。对于沟通不畅,我深表歉意。
-
阅读一下然后使用memset(3);它在标准 C 中。
标签: c arrays linux shell pointers