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

Write to STDIN programmatically for Select()

我将 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;
    }
}

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

如果它是一个普通文件,select 总是 return 有可读的东西。

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

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

可以使用fstat判断文件类型,如果是字符设备,使用isatty判断设备是否为终端设备。