我已经阅读了很多有关即时通讯的内容,但是最近发现的是使用ncurses库。我正在做的是一个简单的http客户端,它将监视一些远程文件夹,以检查其文件是否已更改或是否有新文件。另外,它还必须检查stdin中的某些命令,因此,我计划使用父进程监视stdin,使用工作进程监视远程目录。我想使用键盘中断之类的东西。诸如在键盘按下时安装信号处理程序之类的东西,因此用户不必在每个命令之后按下Enter键。
到目前为止,ncurses可以满足我的需求,但是我无法在stdout上打印内容,而是在stdscr中打印。问题在于该项目是大学的作业,很可能通过读取mi程序标准输出的脚本进行检查...
那么,有什么建议吗?
相关的代码段是:
#include <ncurses.h>
initscr(); /* Start curses mode */
raw(); /* Line buffering disabled */
noecho(); /* Don't echo() while we do getch */
char key;
while (TRUE) {
key = getch();
switch(key)
{
case 's':
printw("Instrucción recibida: STOP\n");
printf("Hasta Luego!\n");
fflush(stdout);
/*NOTICE THIS HAS NO EFFECT, */
refresh();
sleep(2);
endwin(); /* End curses mode */
fflush(stdout);
exit(0);
break;
case 'c':
printw("Instrucción recibida: CONTINUE\n");
refresh();
break;
case 'p':
printw("Instrucción recibida: PAUSE\n");
refresh();
break;
default:
printw("Instrucción desconocida recibida: %c\n",key);
refresh();
}
}
endwin(); /* End curses mode */
当我运行程序时,如果我将输出重定向到文件,则会得到一个空文件
$ verific -d http://url.toMy.directory/ > output
$ cat output
$
谢谢你的帮助!!! =)
最佳答案
这很难找到,我对结果仍然不满意:您可以使用stty()
进入原始模式。这样可以避免(n)次诅咒和对stdout
的任何篡改。
在shell脚本中,您将使用stty raw
(longer explanation)。
此答案包含C代码:Capture characters from standard input without waiting for enter to be pressed
退出前,请不要忘记恢复TTY的设置,否则您的终端会出现异常。我建议将您的代码包装到一个外壳脚本中,该脚本在开头附近包含trap "stty sane" EXIT
。脚本终止时,它将始终执行stty sane
。
关于c - 如何在不按RET的情况下请求输入-C,Linux OS中的键盘中断,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7832996/