2016-04-19 8 views
2

Ich schrieb ein Programm, das eine Nachricht druckt, erwartet eine Benutzereingabe und druckt eine Nachricht erneut. Das einfache Beispiel unten veranschaulicht das. Das Programm wird mit 'prog | gestartet tr 'a-z' 'A-Z'. Nur der letzte Druck sollte von 'tr' a-z '' A-Z 'gehandhabt werden.Umleiten einer Shell erstellt Rohr

int main() 
{ 
    char name[99]; 
    printf ("Your name: "); 
    scanf ("%98s", name); 
    printf ("Your name is: %s\n", name); 

    return 0; 
} 

Ich habe viel mit Pipe, dup, dup2 versucht, aber nichts hat bisher funktioniert. Hat jemand eine Idee, wie ich mein Problem lösen kann?

Antwort

1

Wenn Sie Ihr Programm mit diesem Befehl gestartet werden soll, ist die einzige Art und Weise zu tun, was würden Sie wollen Nachrichten in stderr drucken:

fprintf (stderr, "Your name: \n"); 
+0

Vielen Dank für Ihre Antwort. Ich dachte an Stderr, aber ich hoffte, ich könnte den Missbrauch von Stderr vermeiden. –

+0

@NickBendner Warum versuchen Sie, "die Shell erstellte Pipe umleiten"? – jdarthenay

+0

Unter Umständen fordert mein Prog eine Benutzereingabe an. Zuvor gibt es eine Meldung aus, warum es eine Eingabe benötigt und welche Art von Eingabe es erwartet. Alles funktioniert gut, wenn der Benutzer das Prog nicht mit einer Pipe startet. Wenn der Benutzer dies tut, wird die Nachricht nicht gedruckt, da stdout gepuffert und an die Pipe weitergeleitet wird. Der Benutzer wird nur eine Aufforderung sehen, aber er weiß nicht warum und was er jetzt tun soll. Meine Idee war, die Pipe auszusetzen, die Nachricht auszudrucken, die Benutzereingabe zu erhalten und dann die Pipe wieder aufzunehmen. –

0

Nach einigen Untersuchungen, ich how to check if stdout is directed to a terminal und how to write to terminal selbst gefunden haben wenn ich keinen Griff dazu habe.

So könnte man, wie unten gehen:

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <unistd.h> 

int print_to_terminal(const char *message) 
{ 
    FILE *termout; 

    if (isatty(STDOUT_FILENO)) 
    { 
     termout = stdout; 
    } 
    else 
    { 
     termout = fopen("/dev/tty", "w"); 
     if (termout == NULL) 
     { 
      perror("open"); 
      return EOF; 
     } 
    } 

    int result = fprintf(termout, "%s\n", message); 

    if (termout != stdout) 
    { 
     fclose(termout); 
    } 

    return result; 
} 

int main() 
{ 
    printf("Start of program.\n"); 
    print_to_terminal("Don't worry, be happy."); 
    printf("End of program.\n"); 

    return 0; 
} 

Die Nachricht sollte auch in der aktuellen Terminal ausgedruckt werden, wenn sowohl stdout und stderr in eine Datei gerichtet sind.

+0

Danke. Ich werde es versuchen. –

0

Verwenden Schwanz: http://linux.die.net/man/1/tail

prog | tail -n 1 | tr 'a-z' 'A-Z' 
+0

Danke für deine Antwort, aber der Benutzer entscheidet, wie er das Prog startet. Das tr 'a-z' 'A-Z' war nur ein Beispiel, um zu zeigen, dass das Prog nicht richtig mit einer Pipe funktioniert. –