【问题标题】:How to clear a character pointer array in c ?如何清除 c 中的字符指针数组?
【发布时间】: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


【解决方案1】:

如果你理解 Getln(),你可以回答你自己的问题,为什么不 Getln(&args)?为 args 分配的内存在哪里?必须正确处理函数内为 args 分配内存并返回指向内存的指针,否则您可能会根据目标架构获得指向堆栈或寄存器的指针

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 2016-11-02
    • 2015-08-12
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多