从用户那里获得输入。贝壳

时间:2015-09-19 11:01:35

标签: c

我正在编写自己的简单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);
    }

这种灵魂似乎是最好的,但我不确定。所以,我要求正确并建议/建议我。

提前致谢。

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

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

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分配合适的大小。

相关问题