2 Stimmen

IO-Streams im fork()-Prozess

Der folgende Beispielcode wird ausgeführt, aber die Ausgabe des geforkten Prozesses ist nicht lesbar: Auf der Konsole wird nichts angezeigt, bis ich die Eingabetaste drücke, und dann erscheint "Read failed!".

Die Frage ist: Warum ist das so, und wie kann ich mich mit stdin y stdout del fork() Prozess?

/* example1.c */

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>

int main() {
    pid_t pid = fork();

    if (!pid) {
        // child

        char s[64];
        printf("Enter something: ");
        char *res = fgets(s, 64, stdin);
        if (!res) {
            printf("Read failed!\n");
        } else {
            printf("You entered: %s", s);
        }
    }

    return 0;
}

Aktualisierung:

Ein weiteres Beispiel für das seltsame Verhalten von IO-Streams:

/* example2.c */

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>

int main() {
    pid_t pid = fork();

    if (!pid) {
        // child

        char *argv[] = {
            "-c",
            "/home/user/echo.sh",
            NULL
        };

        execv("/bin/sh", argv);
    }
    return 0;
}

echo.sh Drehbuch:

#!/bin/sh

read -p "Enter something: " INPUT
echo "You entered $INPUT"

Dieser kehrt zurück

Enter something: /home/user/echo.sh: line 3: read: read error: 0: Input/output error
You entered

Update 2:

Sieht aus, als ob dieser Code genau das tut, was nötig ist:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>

int main() {
    pid_t pid = vfork();
    if (!pid) {
        // child
        system("/home/user/echo.sh");
    }
    return 0;
}

Die Lösung bestand darin, die fork con vfork . Ich weiß nur nicht, warum dieser hier funktioniert...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X