我正在攻读考试,我对Unix中的规范与非规范输入/输出的工作原理感到困惑(例如,curses).我知道有一个缓冲区,"行规则"应用于规范输入.这是否意味着缓冲区被旁路用于非规范输入,还是仅仅意味着没有应用线路规则?输入和输出操作的这个过程有何不同?
在我使用的curses程序中演示了规范输入,用户输入的输入是在键入一定数量的字符或经过一定时间后自动输入的.这些事情中的任何一个都被视为"线条学科"还是完全不同于其他事情?
我正在努力在linux上创建一个简单的shell.我可以创建一些东西来学习如何使用基本系统调用.
场景:命令中的用户类型,按Tab键(因此shell自动完成其命令),弹出自动完成的命令(或建议),用户按Enter键,命令evals并执行.
就像在bash中一样.
我已经想出如何进行evals,将命令转换为标记,使用管道和东西执行它.我无法弄清楚的是输入部分.即那些标签击键.
我知道我有什么选择:
getc() - 分别获取每个字符,将其存储在缓冲区中.无法弄清楚如何获得Tab键击,因为它会暂停执行,直到它看到'\n'或Ctrl + D. 有点贵,因为命令中的每个字符都会有1个getc().另外,我将不得不处理缓冲区重新分配,摊销......嘘......scanf("%s") - 太担心缓冲区溢出.我不能得到那些标签击键.暂停执行read()(来自unistd.h) - 可能是我不想做的事情.但是我看到这里的人说使用它来做这件事真的很痛苦.我检查了.它是.getline() - 无法获得Tab键击.我查看了bash源代码,看看它是如何处理输入的,以及OH MY GOD.有450行代码专门用来做这个简单的事情(input.c文件).
真的没有比这更简单的解决方案吗?我不想使用ncurses,我不关心可移植性,我只是想实现一个目标:获取用户输入并知道他何时按Tab键.尽可能少地努力,优雅地做到这一点.
我正在尝试编写一个简单的小代码片段来响应箭头按键.我知道up由^ [[A表示,我有以下代码检查该序列:
while( 1 )
{
input_char = fgetc( stdin );
if( input_char == EOF || input_char == '\n' )
{
break;
}
/* Escape sequence */
if( input_char == 27 )
{
input_char = getc( stdin );
if( input_char == '[' )
{
switch( getc( stdin ) )
{
case 'A':
printf("Move up\n");
break;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
每当我点击"向上"时,转义序列(^ [[A]显示在屏幕上,但"上移"直到我按下回车才出现.
最终目标是用其他一些数据替换当前行上的文本,所以我试着这样做
printf("\r%s", "New Text");
Run Code Online (Sandbox Code Playgroud)
取代"向上移动",但在按下输入后仍然不会显示.
我在读字的方式有问题吗?
谢谢!
编辑快速注释,它适用于*nix系统.
解决方案 感谢大家的指点.我选择了stepanbujnak的解决方案,因为它非常简单.我注意到的一件事是修改字符串(退格等)的键的很多行为与你期望的不同.它会在线上退出任何东西(包括printf'd的东西),我不得不考虑到这一点.在那之后,让其他人排成一行并不太糟糕:)