我正在编写一个Vala程序,该程序使用stdout&作为child_process生成。 stdin用于与父进行消息传输。在异步方法中,我调用read_stdin(sb)来检查传入的消息。我尝试了各种stdin方法,比如get和getc,但它们似乎都阻止了' \ n'新队。我需要读取所有可用的字符并立即返回(非阻塞)。
const int STDIN_BUF_SIZE=1024;
char[] stdin_buffer;
bool read_stdin (StringBuilder sb) {
int iPos=0;
int c;
int buf_size=STDIN_BUF_SIZE-1;
// Char by char:
while (true) {
c = stdin.getc ();
if(c == GLib.FileStream.EOF) break;
stdin_buffer[iPos]=(char)c;
iPos++;
if ((char)c=='\n'||iPos==buf_size){
break;
}
}
if(iPos>0){
stdin_buffer[iPos]=0;
sb.append((string)stdin_buffer);
return true;
}
return false;
}
stdin可用于非阻塞IO,还是需要创建类似......
的东西DataInputStream stdin_reader = new DataInputStream(stdin);
答案 0 :(得分:0)
您使用术语“非阻塞”,但我认为这并不意味着您的意思。如果非阻塞I / O是你真正想要的,那么用/dev/stdin
简单地打开O_NONBLOCK
将非常容易。在这种情况下,getc
会立即返回EOF
,直到有可用的数据。
AFAICT,你想要的是getc
调用阻塞直到新数据可用,然后立即返回。从技术上讲,这就是正在发生的事情。皱纹是终端应用程序通常缓冲数据直到换行,这解释了为什么您可以编辑数据而不对您的应用程序显示任何编辑;继续,尝试在你的程序中输入“AB”,你所看到的就是“B \ n”。
基本上,您需要使用curses library。 Vala包含一个curses.vapi,所以你只需要链接到相关的库(可能是ncurses)并将--pkg curses
添加到你的valac
调用中,你就可以了。 IIRC相关功能是getch
,但我没有在长时间内完成任何curses编程。