mit pipe() zwischen zwei Prozessen verbinden



  • Hallo,
    ich hab mal eine Frage zu pipe(): in den Manpages findet sich folgendes Beispiel:

    #include <sys/wait.h>
    #include <assert.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>
    int main(int argc, char *argv[])
    {
        int pfd[2];
        pid_t cpid;
        char buf;
        assert(argc == 2);
        if (pipe(pfd) == -1) { perror("pipe"); exit(EXIT_FAILURE); }
    
        cpid = fork();
        if (cpid == -1) { perror("fork"); exit(EXIT_FAILURE); }
        if (cpid == 0) {    /* Child reads from pipe */
            close(pfd[1]);          /* Close unused write end */
            while (read(pfd[0], &buf, 1) > 0)
                write(STDOUT_FILENO, &buf, 1);
            write(STDOUT_FILENO, "\n", 1);
            close(pfd[0]);
            _exit(EXIT_SUCCESS);
        } else {            /* Parent writes argv[1] to pipe */
            close(pfd[0]);          /* Close unused read end */
            write(pfd[1], argv[1], strlen(argv[1]));
            close(pfd[1]);          /* Reader will see EOF */
            wait(NULL);             /* Wait for child */
            exit(EXIT_SUCCESS);
        }
    }
    

    Ich wuerde das gerne statt mit fork() mit zwei Prozessen so ausprobieren wollen. Also etwa Programm A fraegt zuerst auf der Konsole nach der PID von Prozess B, dann verbindet A seine Pipe mit Prozess B und wartet auf das Starten der Uebertragung; Prozess B macht das gleiche.

    Ich glaube, dass es irgendwie mit fcntl() gehen muesste, nur weiss ich nicht wie, ich habe mir folgendes ueberlegt, s.u.

    Programm A

    // ...
    pid_t pid_anderer_prozess;
    // ...
    int pfd[2];
    fcntl(pfd, F_SETOWNER, pid); // ???
    if(0 > pipe(pfd)){ perror("pipe failed"); exit(EXIT_FAILURE); }
    // ...
    /* warte auf SPACE Taste, dann Sende die Botschaft an B */
    // ...
    /* warte auf SPACE Taste, dann lies die Botschaft aus dem Pipe aus */
    // ...
    

    Programm B sollte in etwa so aussehen:

    // ...
    pid_t pid_anderer_prozess;
    // ...
    int pfd[2];
    fcntl(pfd, F_SETOWNER, pid); // ???
    if(0 > pipe(pfd)){ 
    perror("pipe failed");
    exit(EXIT_FAILURE);
    }
    // ...
    /* warte auf SPACE Taste, dann lies die Botschaft aus dem Pipe aus */
    // ...
    /* warte auf SPACE Taste, dann Sende die Botschaft an B */
    // ...
    

    Frage:
    Wie verbinde ich also zwei nicht geforkte Prozesse mit pipe()?

    Andererseits habe ich auch schon ueberlegt, die Prozesse etwa in die gleiche Prozessgruppe zu schaufeln und als Owner von pfd per fcntl() die gpid der Prozessgruppe zu setzten - geht das eigentlich? Muessten denn dann nicht alle Prozesse in der Gruppe ueber diesen Pipe "broadcast" empfangen?

    Danke im voraus. 🙂



  • mit pipe afaik gar nicht, müsstest schon ne Named Pipe verwenden, mit denen geht das Ganze dann schön.



  • Vorden schrieb:

    mit pipe afaik gar nicht, müsstest schon ne Named Pipe verwenden, mit denen geht das Ganze dann schön.

    Named pipe? Kannst Du mir ein Beispiel geben, oder einen Link dazu? Danke



  • Fabeltier schrieb:

    Vorden schrieb:

    mit pipe afaik gar nicht, müsstest schon ne Named Pipe verwenden, mit denen geht das Ganze dann schön.

    Named pipe? Kannst Du mir ein Beispiel geben, oder einen Link dazu? Danke

    Named Pipes sind auch als FIFOs bekannt:

    schaumal man 3 mkfifo, man 2 mknod und hier: http://tldp.org/LDP/lpg/node15.html

    im prinzip legst du zwei special files an (die named pipes oder FIFOs). Der eine
    Prozess schreibt in die eine pipe und liest aus der anderen. Der andere Prozess machts umgekehrt. Very simpel 😉


Log in to reply