从用户那里获取输入。外壳

问题描述 投票:0回答:2

我正在编写自己的简单Shell,目前正在考虑从用户那里获取输入(命令)。

我编写了以下原型:

 while(1) {
        printf("gsh> ");
        fflush(stdout);
        total_len = 0;
        do {
            len = read(0, buffer,  MAX_LENGTH_OF_COMMAND-total_len -1);
            total_len+= len;
            } while( buffer[total_len-1] != '\n');
        buffer[total_len]='\0';
        parse(buffer);
    }

而且这种灵魂似乎对我来说是最好的,但是我不确定。所以,我要的是正确的,并向我推荐/建议。

提前感谢。

c
2个回答
1
投票

您可能更喜欢使用getchar(),这样您就可以捕获像上箭头和下箭头(通常对shell历史记录有用)之类的按键,这些按键在按下时会产生多个字符。您可能还希望将终端设置为原始终端,以获取无阻塞输入。

#include <termios.h>
#include <unistd.h>
int main()
{
  struct termios oldt;
  struct termios newt;

  tcgetattr(0, &oldt);
  memcpy(&newt, &oldt, sizeof(newt));
  cfmakeraw(&newt);
  tcsetattr(0, TCSANOW, &newt);
  /* your read function ...*/

  /* before exiting restore your term */                                                                   
  tcsetattr(0, TCSANOW, &oldt);
}

0
投票

创建自定义提示的好方法是使用read。有多种方法,因此总会有一个更清洁/更好的解决方案。但这是我的:

while ((fd = read(0, buff, BUFF_SIZE) > 0) {
    if (fd == BUFF_SIZE)
        // Command to big, handle this as you want to
    buff[fd - 1] = '\0';
    // Do what you want with your buff
}

当然,此解决方案具有最大缓冲区大小。您需要将read封装在anoter函数内部,并使用malloc分配合适的大小。

© www.soinside.com 2019 - 2024. All rights reserved.