我正在编写自己的简单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);
}
而且这种灵魂似乎对我来说是最好的,但是我不确定。所以,我要的是正确的,并向我推荐/建议。
提前感谢。
您可能更喜欢使用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);
}
创建自定义提示的好方法是使用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分配合适的大小。