2016-04-21 5 views
0

私はコマンドラインで入力を待っているループにselect()を配置しました。 STDINにプログラムで書き込んだり、select()にそれを取り込ませてもらえますか?Select()のプログラムでSTDINに書き込み

私は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

[文字列をttyに入れてコマンドを作成する](http://unix.stackexchange.com/questions/48103/construct-a-command-by-putting-a-string-into-a)の可能な複製-tty) – Scott

答えて

1

まあ、それはstdinで開いているファイルの性質に非常に依存します。

通常のファイルの場合は、selectは常に何かを読み取って返します。

パイプまたはソケットの場合は、そのソケットの反対側にデータを書き込む必要があります。 Linux上でファイル記述子を相手側に開いていない場合は、書き込みモードで/proc/self/fd/0を開いてファイルディスクリプタを取得できます。

端末デバイスの場合は、TIOCSTI ioctlを使用できます。

fstatを使用してファイルの種類を判断し、文字デバイスの場合はisattyを使用して、デバイスが端末デバイスであるかどうかを確認できます。

+0

ありがとうございます。それは端末装置だった。 TIOSCTIは働いた。では、write()はfdがSTDINの場合はどこに書き込むのですか? – Timtianyang

+0

fd 0が端末デバイス上で読み書きモードでオープンされている場合、 'write(0、" data ")'はそのデバイスにデータを書き込み、端末デバイスに書き込むと、 (ターミナルエミュレータの表示の場合はpty、sshクライアントへの送信の場合はsshdとなります)、デバイスから読み取ると相手側から送信されたデータが読み込まれます。読取り専用モードでオープンされている場合は、EBADFエラーとともに書込みが戻されます。 –

関連する問題