以编程方式为Select()写入STDIN

时间:2016-04-21 15:31:04

标签: stdin

我将select()放在循环中,等待命令行中的输入。无论如何以编程方式写入STDIN然后让select()捕获它?

我已尝试将write(),fputs()写入STDIN,但select()仍无法看到STDIN中的更改。

while( 1 ){
    ....
    rt = select(fdmax+1, &readfds, NULL, NULL, &time_out);

    if ( rt == 0 ) // if it timesout, write to STDIN for the next loop
    {
       char message[20] = "hihihihi\n";
       write(STDIN, message, strlen(message));

       printf("wrote\n");
       continue;
    }
}

1 个答案:

答案 0 :(得分:1)

嗯,这在很大程度上取决于stdin上打开的文件的性质。

如果它是常规文件,select将始终返回并阅读。

如果它是管道或套接字,则需要在该套接字的另一端写入数据。如果您没有向另一端打开文件描述符,则在Linux上,您可以通过在写入模式下打开/proc/self/fd/0来获取文件描述符。

如果它是终端设备,您可以使用TIOCSTI ioctl。

您可以使用fstat确定文件类型,如果是字符设备,请使用isatty检查设备是否为终端设备。