读stdin非阻塞

时间:2018-01-25 00:44:32

标签: vala

我正在编写一个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);

1 个答案:

答案 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编程。