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...