Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Programm rekursiv aufrufen (mit execlp und pipes)

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
28.12.2008, 21:52 Uhr
~intoxicated
Gast


Hallo!

Ich habe ein Problem und zwar will ich einen rekursiven merge sort algorithmus programmieren, der die zu sortierenden daten über stdin einliest und dann jeweils durch den vater 2 kindprozesse erzeugt werden, welche dann mit execlp den Sortieralgorithmus nochmals aufrufen.

Blöd ist aber, dass ich noch nicht genau weiß wie ich das angehe und deshalb habe ich mir gedacht ich schreib einfach ein kleines testprogramm, um zu sehen wies funktionieren könnte, aber ich scheitere schon bei den rekursiven aufrufen:

Wenn ich das untere programm test.c ausführe, kann ich einmal über stdin daten eingeben und dann stürzt es ab (nach dem 1. rekursiven aufruf) und es tut sich nichts mehr.

Ich muss aber ehrlich sagen, dass ich pipes noch nicht zu 100% durchschaut habe - weiß nicht ganz, ob das stimmt, wenn ich eine Leseumenkung nach stdin und eine Schreibumlenkung nach stdout mache (im childprozess) und ob die daten dann beim rekursiven aufruf auch da landen...

Mein ziel im unteren programm ist einfach, dass ich mittels execlp das gleiche programm nochmals rekursiv aufrufen möchte und dass die ganzen eingegebenen daten (auf stdin) von den childprozessen asugegeben werden.

hoffe ihr könnt mir helfen!

lg + danke für jede hilfe!

/* test.c */

C++:
#include <unistd.h>
#include <sys/wait.h>
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>

#define EXIT(s) {fprintf(stderr, "%s",s); exit(EXIT_FAILURE);}

enum{ ERROR = -1, SUCCESS };

int main (int argc, char **argv) {
    int fd[2];
    pid_t pid;


    char *progname = argv[0];
    if (pipe (fd) == ERROR)
        EXIT ("Fehler bei pipe ...\n");
    if ((pid = fork ()) == ERROR)
        EXIT ("Fehler bei fork ...\n");

    fprintf(stderr, "%s: %d: created pipes: p<-%d c->%d \n",progname, getpid(), fd[0], fd[1]);


    if (pid > 0) {     /*Elternprozess */

        char puffer[128];
        char c = 0;
        strcpy(puffer,&c);
        fgets(puffer,10,stdin);

        if(strlen(puffer) <= 3){
            exit(0);
        }

        close (fd[0]);   /*Wir schließen die Leseseite */

        write(fd[1],puffer,10);
        if (waitpid (pid, NULL, 0) == ERROR)
            EXIT ("Fehler bei waitpid ... \n");
        exit (EXIT_SUCCESS);
    }
    else {        /*Kindprozess ließt aus der pipe mit less */

        char buf[128];
        char c = 0;
        strcpy(buf,&c);

        close (fd[1]);

        if (fd[0] != STDIN_FILENO) {   /*muss überprüft werden */
            /*duplizieren Standardeingabe */
            if (dup2 (fd[0], STDIN_FILENO) != STDIN_FILENO){
                EXIT ("Fehler bei dup2 ...\n");
            }
            dup2(fd[1],STDOUT_FILENO);
            close (fd[0]);   /*Wird nicht mehr benötigt */
            close(fd[1]);
        }

        read(0, buf , 15);
        fprintf(stderr,"%s",buf);
        if(strlen(buf) <= 3){
            exit(0);
        }

        if (execlp(progname, "test4", NULL) == ERROR) {
            EXIT ("Fehler bei execl ...\n");
        }
    }
    return EXIT_SUCCESS;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
31.12.2008, 12:32 Uhr
0xdeadbeef
Gott
(Operator)


Geht's darum, Forken zu üben? Ansonsten wär das mit Threads nämlich deutlich einfacher.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: