2016-04-21 8 views
0

Ich platziert select() in einer Schleife auf Eingaben in der Befehlszeile warten. Gibt es trotzdem programmatisch auf STDIN zu schreiben und dann auswählen() erfassen?Schreiben Sie programmgesteuert für STDIN für Select()

Ich habe write() versucht, fputs() zu STDIN, aber select() kann die Änderung in STDIN immer noch nicht sehen.

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

Mögliches Duplikat von [Konstruieren Sie einen Befehl, indem Sie einen String in ein tty einfügen] (http://unix.stackexchange.com/questions/48103/construct-a-command-by-putting-a-string-into-a- -tty) – Scott

Antwort

1

Nun, es hängt sehr viel von der Art der Datei offen auf Stdin. Wenn es eine normale Datei war, würde select immer mit etwas zum Lesen zurückkehren.

Wenn es eine Pipe oder ein Socket ist, müssen Sie Daten am anderen Ende dieses Sockets schreiben. Wenn für das andere Ende kein Dateideskriptor geöffnet ist, können Sie unter Linux eine Datei öffnen, indem Sie im Schreibmodus /proc/self/fd/0 öffnen.

Wenn es ein Endgerät ist, können Sie die TIOCSTI ioctl verwenden.

Sie können fstat verwenden, um den Dateityp zu ermitteln. Verwenden Sie isatty, um zu überprüfen, ob es sich bei dem Gerät um ein Terminalgerät handelt.

+0

Danke. Es war ein Endgerät. TIOSCTI hat gearbeitet. Also, wo schreibt write(), wenn das fd STDIN ist? – Timtianyang

+0

Wenn fd 0 im Lese-/Schreibmodus auf einem Endgerät geöffnet wurde, schreibt 'write (0," data ")' Daten in dieses Gerät, und das Schreiben auf ein Endgerät bewirkt, dass Daten an das andere gesendet werden Ende (im Falle eines Pty an den Terminal-Emulator für die Anzeige oder an sshd an den ssh-Client zu senden ...), beim Lesen vom Gerät liest die Daten vom anderen Ende gesendet. Wenn es im schreibgeschützten Modus geöffnet wurde, wird der Schreibvorgang mit einem EBADF-Fehler zurückgegeben. –