以编程方式为 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
判断设备是否为终端设备。
我将 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
判断设备是否为终端设备。