Filedeskiptor mit exec an neuen Prozess übergeben



  • Hallo,

    ich will einen C Filedeskiptor mit exec in Linux an einen neuen Prozess übergeben und diesen dann für weiteres schreiben/lesen benutzen.
    Da man mit den verschiedenen exec befehlen nur char pointer aber keine filepointer übegeben kann würde ich gern wissen ob hier jemand weiss wie man einen Filepointer sinnvoll in einen charpointer konvertieren kann und wieder zurück.

    Vielen dank,
    wkv



  • Einen Filedeskriptor oder einen Filepointer? Ein Filedeskriptor ist eine Zahl, ein Filepointer wird meistens mit FILE* asoziiert.
    Deine Vorgehensweise ist mir ein wenig diffus. Ob man einen Filedeskriptor in eine Pointer-Variable quetschen kann? Ja, sollte gehen. Lass das aber lieber.

    char-Pointer sind nicht böse! Verschaff dir sicheren Speicher und übergib einen Zeiger darauf.



  • Was du dem "externen" Programm mit exec() auf den Weg gibst, sind die Kommandozeilenparameter - nicht mehr und nicht weniger.
    Wenn das mit exec() aufgerufene Programm auf eine bestimmte Datei zugreifen soll, dann musst du ihm entweder den Dateinamen als Parameter übergeben, und das Programm öffnet die Datei dann selbst, oder als Alternative kannst du den immer vorhandenen Datei-Deskriptor stdin mit der Funktion dup2() auf die geöffnete Datei umleiten, sodass das externe Programm den Inhalt der Datei über den Standard-Eingabekanal erhält.
    Wie das genau geht, findest du u. a. in meinem Buch "C und Linux" auf Seite 98. 😃



  • Du kannst auch auf dem Filedeskriptor mittels fcntl und F_SETFD das close-on-exec Bit löschen und dem Kindprozess die Nummer als Kommandozeilenparameter übergeben.

    Den Filedescriptor eines Streams kannst Du übrigens mit fileno() erhalten, umgekehrt mit fdopen aus einem Descriptor einen Stream erzeugen.



  • LordJaxom schrieb:

    Du kannst auch auf dem Filedeskriptor mittels fcntl und F_SETFD das close-on-exec Bit löschen und dem Kindprozess die Nummer als Kommandozeilenparameter übergeben.

    Gar nicht nötig, da es sowieso schon aus ist. 🙂



  • Mr. N schrieb:

    Gar nicht nötig, da es sowieso schon aus ist. 🙂

    Vollkommen richtig. War ein Irrglaube.

    man 2 open schrieb:

    The new file descriptor is set to remain open across an execve(2) (i.e., the FD_CLOEXEC file descriptor flag described in fcntl(2) is initially disabled).


Anmelden zum Antworten