我将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;
}
}
答案 0 :(得分:1)
嗯,这在很大程度上取决于stdin上打开的文件的性质。
如果它是常规文件,select
将始终返回并阅读。
如果它是管道或套接字,则需要在该套接字的另一端写入数据。如果您没有向另一端打开文件描述符,则在Linux上,您可以通过在写入模式下打开/proc/self/fd/0
来获取文件描述符。
如果它是终端设备,您可以使用TIOCSTI
ioctl。
您可以使用fstat
确定文件类型,如果是字符设备,请使用isatty
检查设备是否为终端设备。