【问题标题】:C input loop for shellshell的C输入循环
【发布时间】:2011-01-08 00:30:06
【问题描述】:

所以我正在努力创建一个非常简单的 C 程序,它只执行 shell 命令。这是我目前所拥有的:

#include <stdio.h>
int main()
{
char input[30];
fputs("$ ", stdout);
fflush(stdout);
fgets(input, sizeof input, stdin);
system(input);
}

它有效,但仅适用于一个命令。例如,如果我编译并输入 ./cmd 我会得到 $ 提示符。如果我输入 ls 我会得到我应该得到的。但随后它退出并返回到常规系统外壳。如何在用户键入命令后返回“$”输入。

【问题讨论】:

    标签: c shell loops input


    【解决方案1】:

    您正在寻找的是循环;如果您想让退出条件由用户输入确定,实际上您可能需要有一个无限循环(惯用方式是for(;;))和一个if 在输入获取后导致break 如果你条件满足。

    #include <stdio.h>
    
    int main()
    {
        char input[30];
        for(;;) /* infinite loop */
        {
            fputs("$ ", stdout);
            fflush(stdout);
            fgets(input, sizeof input, stdin);
            if(/* put here your exit condition */)
                break; /* breaks out of the loop */
            system(input);
        }
        return 0;
    }
    

    您的退出条件可能涉及使用strcmp(来自&lt;string.h&gt;)在用户输入的字符串和您的退出命令之间进行比较。

    【讨论】:

    • Thanks 实际上效果很好。如果用户键入“exit”,我将在退出条件中添加什么以使 shell 退出?
    • 它作为练习留给读者,但由于所有其他答案已经说明......它应该是strcmp(input, "exit\n")==0;查看strcmp 文档以了解其工作原理。
    • 我认为惯用的方法是 do-while 循环。
    • @SiegeX:不,因为条件几乎肯定在循环体的中间,而不是在末尾。这就是为什么 do-while 很少有用... :-(
    • @SiegeX:有些人使用while(1) 进行无限循环,但是当您具有高警告级别(“条件中的常量表达式”)时,这可能会在多个编译器中触发警告,所以for(;;) 是通常首选。
    【解决方案2】:

    您需要将代码放在循环中。例如:

    int main()
    {
        while (1) {
            char input[30];
            fputs("$ ", stdout);    
            fflush(stdout);
            fgets(input, sizeof input, stdin);
            system(input);
        }
    }
    

    while (1) { ... } 是一个无限循环。退出它的唯一方法是以某种方式杀死你的程序。为了能够使用命令退出循环,您需要在其中添加某种条件:

        while (1) {
            char input[30];
            fputs("$ ", stdout);    
            fflush(stdout);
            fgets(input, sizeof input, stdin);
            if (strcmp(input, "exit") == 0) {
                break;
            }
            system(input);
        }
    

    strcmp() 进行比较以查看您是否输入了“退出”。如果是这样,那么break 语句退出最近的循环,您的程序结束。

    【讨论】:

    • 修复了这个问题。你一定用的是相当老的 C。
    • @AustinM: 在 C89 中 booltruefalse 未定义(如果您不包含 stdbool.h,则在 C99 中也是如此);将1 替换为true 或使用for(;;) 替换while(true)
    【解决方案3】:

    您不想要任何循环,您想要一个do while 循环,因为您总是希望至少执行一次system() 命令。此外,通过将关键字exit 用作您的中断条件,在调用system() 之前无需额外的代码来检查input,因为如果您使用strcmp()exit 将杀死您的shell 和您的程序@作为 do-while 条件语句。

    #include <stdio.h>
    #include <string.h>
    
    int main(void)
    {
      char input[30];
      do {
        fputs("$ ", stdout);
        fflush(stdout);
        fgets(input, sizeof input, stdin);
        system(input);
      } while(strcmp(input,"exit\n"));
    
      return 0;
    }
    

    输出

    [siegex@localhost]$ ./myshell
    $ echo foo
    foo
    $ echo bar | sed 's/r/z/'
    baz
    $ exit
    [siegex@localhost]$
    

    【讨论】:

      猜你喜欢
      • 2019-03-05
      • 2012-07-29
      • 2013-04-23
      • 1970-01-01
      • 2014-08-25
      • 2012-11-10
      • 1970-01-01
      • 2014-12-28
      • 1970-01-01
      相关资源
      最近更新 更多