我正在使用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;
}
答案 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'