使用读取系统调用时循环不会退出

时间:2017-07-02 23:41:07

标签: c while-loop system-calls

我正在使用linux系统调用构建一个充当shell的基本程序。现在我正试图让它以字符串形式读取输入,以便我可以根据需要修改信息。当我运行程序并从终端给它一些输入后,它继续挂起。我猜我的while循环不会结束,但我不知道为什么。任何和所有的帮助将不胜感激。

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char ** argv) {
    int i;

    char prompt[3] = "sh#";
    char input[256];
    char inputc;

    /*print out prompt */
    write(1, &prompt, sizeof(prompt));

    i = 0;
    while(read(0, &inputc, 1) != 0) {
        input[i] = inputc;
        i++;
    }
    input[i] = '\0';  /* null terminator */
    printf("%s\n", input);  

    return 0;
}

1 个答案:

答案 0 :(得分:0)

您应该使用getline()代替read()。因为getline()为你做了很多工作。此外,如果您只想从输入中接收1行,则只需使用read()getline()而不使用您建立的while()循环。对于多个输入,while循环是最需要的,这是我假设你想要的,因为你将它称为shell类型程序,并且你的提示字符串中包含sh

如果您想在代码中使用read(),那么您应该创建自己使用getline()的{​​{1}}。这可能是使用read()为您的循环设置自己的my_getline()函数代码的示例,您应该根据需要添加条件以便中断。

read()

我已使用此修复程序修改了代码并删除了不必要的变量。您没有使用char *inputc, input[256]; int i; for (i = 0; (read(STDIN_FILENO, inputc, 1) != EOF); i++) { input[i] = inputc[0]; } argc,因此也会将其删除。 while循环使用**argv而不是getline()。每个输入行后都会打印字符串。当输入字符串为:read()时,迷你shell终止。如果您想在没有输入的情况下终止,您也可以为此添加修改。

"quit"

终端输出(第三个输入只是换行符$ cat main.c #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> int main(void) { size_t size = 256; char prompt[5] = "sh$ "; char *inputc = NULL; /* print out prompt */ write(1, &prompt, 4); while(getline(&inputc, &size, stdin) != -1) { /* check if input is "quit" to terminate the mini shell */ if (strncmp(inputc, "quit", 4) == 0) break; /* prints the input */ printf("%s", inputc); /* re-print out prompt to continue loop*/ write(1, &prompt, 4); } printf("%s\n", inputc); return 0; } 或[RTN]按钮,没有输入,也没有打印任何内容:

'\n'