Zwei Prozesse kommunizieren ueber eine Pipe, der eine liesst der andere schreibt



  • Hallo,

    habe folgendes Programm, welches mit fork() zwei Prozesse erzeugt
    und dann kommunizieren beide ueber eine Pipe miteinander. Bei der
    Eingabe benutze ich getline. Ich wuerde gerne alles auf C umstellen
    wie kann ich getline ersetzen?

    #include <sys/wait.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string>
    #include <iostream>
    #include <string.h>
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        int pfd[2];
        pid_t cpid;
        char buf;
        if (pipe(pfd) == -1) { perror("pipe"); exit(EXIT_FAILURE); }
        cpid = fork();
        if (cpid == -1) { perror("fork"); exit(EXIT_FAILURE); }
        if (cpid == 0) {   
            close(pfd[1]);          
            while (read(pfd[0], &buf, 1) > 0)
                write(STDOUT_FILENO, &buf, 1);
            write(STDOUT_FILENO, "\n", 1);
            close(pfd[0]);
            _exit(EXIT_SUCCESS);
        } else {            
            close(pfd[0]);          
            string eingabe;
    	while(getline(cin,eingabe))
              write(pfd[1], eingabe.c_str(), strlen(eingabe.c_str()));
            close(pfd[1]);          
            wait(NULL);             
            exit(EXIT_SUCCESS);
        }
    }
    


  • man: fgets

    btw. benutze bitte einen Titel, der auch etwas mit deiner Frage zu tun hat 🙄



  • stdout, stderr, stdin sind vom Typ FILE*. Und hey .. fprintf, fscanf arbeiten mit diesen Typen.



  • Hi,

    danke fuer die Infos!Habe es jetzt mit fgets probiert, aber irgendwie kommen
    komische Zeichen heraus. Was mache ich falsch? Hat das irgendwas mit Nullterminierten Zeichenketten zu tun?

    while(fgets(buf,1024,stdin))
        write(pfd[1], &buf, strlen(buf));
    


  • write(pfd[1], buf, strlen(buf));
    

    (ich hoffe, dass buf auch ein char buf[1024]; ist und nicht das char buf; aus dem Originalcode)



  • rüdiger schrieb:

    write(pfd[1], buf, strlen(buf));
    

    (ich hoffe, dass buf auch ein char buf[1024]; ist und nicht das char buf; aus dem Originalcode)

    Aber wenn buf buf auch ein char buf[1024]; ist, dann ist doch &buf das gleiche wie buf , oder?
    🙂


Anmelden zum Antworten