named pipes



  • Hi!

    Ich habe folgenden code, mit dem ich eine named pipe erzeuge und dann von dieser text einlese und diesen dann auf der standardausgabe ausgebe:

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <signal.h>
    
    int created = 0;
    FILE *pipe = NULL;
    
    void handler(int signal) 
    {
    	if (pipe != NULL) {
    		fclose(pipe);
    	}
    	if (created != 0) {
    		remove("pipe");
    	}
    	exit(EXIT_SUCCESS);
    }
    
    int main(void)
    {
    	char buf[1024];
    
    	signal(SIGINT, handler);
    	signal(SIGQUIT, handler);
    	signal(SIGTERM, handler);
    
    	mkfifo("pipe", 0666);
    	created = 1;
    
    	while (1) {
    		pipe = fopen("pipe", "r");
    		fgets(buf, 1024, pipe);
    		printf("%s", buf);
    		fclose(pipe);
    		pipe = NULL;
    	}
    
    	return 0;
    }
    

    (Der code ist übrigens direkt lauffähig, also zum ausprobieren nur abspeichern kompilieren und ausführen)

    Wenn ich dann das programm im hintergrund mit ./server & starte und dann etwas mit echo "hallo" > pipe in die pipe schreibe, dann wird der text zwar korrekt ausgegeben, aber nachdem er ausgegeben wurde wird nicht zum normalen prompt zurückgekehrt, sondern es erscheint zuerst ein leerer prompt, wenn ich dann die eingabetaste drücke, komme ich wieder zum gewöhnlichen prompt. Wie kann ich es erreichen dass ich sofort zum normalen prompt gelange?

    lg, mocky



  • Bei mir funktioniert dein Programm korrekt.

    thomas@macbook:~$ ./test &
    [1] 3450
    thomas@macbook:~$ echo bla > pipe 
    bla
    thomas@macbook:~$
    

    Die Prompt erscheint direkt, ohne das ich die
    Eingabetaste betätige. Ich benutzte bash && xterm.

    //EDIT:
    Hab das Problem doch noch reproduzieren können.
    Es scheint einfach so zu sein das die Bash die
    Prompt schreibt bevor dein Programm die Pipe
    ausliest und die Nachricht schreibt.

    Mir fällt eigentlich nur eine Möglichkeit ein
    um das zu Verhindern:
    echo bla > pipe && sleep 0.1



  • Dieser Thread wurde von Moderator/in Tim aus dem Forum ANSI C in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • mocky schrieb:

    aber nachdem er ausgegeben wurde wird nicht zum normalen prompt zurückgekehrt, sondern es erscheint zuerst ein leerer prompt

    Der Prompt wird überhaupt nicht verlassen. Das Problem ist, dass das Programm einfach auf stdout schreibt und da aber schon die shell ihre Ausgabe hat. Es vermischt sich also die Ausgabe von dem Programm und der Shell.


Anmelden zum Antworten