[Gelöst] Also für diese Übung, die ich zugewiesen wurde üben wir Prozesskontrolle. Ich wundere mich einfach, warum es scheint, dass mein Kindprozess nie ausgeführt wird (wenn child_pid == 0). Jede Hilfe zu diesem Thema würde sehr geschätzt werden! Auch safe_fork() ist eine Funktion, die unser Lehrer geschrieben hat, um zu vermeiden, dass Schüler zu viele Prozesse öffnen.C - Child Prozess nicht ausgeführt
#include "safe-fork.h"
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
int main(void) {
pid_t child_pid;
int pipefd[2];
int pipe_result;
int count;
pipe_result = pipe(pipefd);
if (pipe_result == -1) {
perror("pipe failure");
exit(1);
}
child_pid = safe_fork();
/*Parent Process*/
if (child_pid > 0) {
dup2(pipefd[0], STDIN_FILENO);
scanf("%d", &count);
if (count > 200) {
printf("Long enough!\n");
exit(0);
}
else {
printf("Too short!\n");
exit(1);
}
}
/* Child Process */
else {
dup2(pipefd[1], STDOUT_FILENO);
execl("/usr/bin/wc", "-w");
}
return 0;
}
Wenn Sie eine der 'scanf()' -Familien von Funktionen aufrufen, überprüfen Sie immer den zurückgegebenen Wert (nicht die Parameterwerte), um sicherzustellen, dass der Vorgang erfolgreich war. Beim Aufruf einer der 'exec()' -Familien von Funktionen kehren sie nur zurück, wenn ein Fehler aufgetreten ist, also folgen Sie dem Aufruf mit: 'perror (" exec ?? failed "); exit (1); ' – user3629249
Der Elternprozess sollte' waitpid (child_pid, NULL) aufrufen; Vor der Rückkehr. Im aktuellen Szenario wird das Kind nie zurückkehren, da keine Datei/Eingabe an die "wc" -Funktion übergeben wird, so dass es für immer bei stdin sitzen bleibt, für die Eingabe.Schlagen Sie vor, einen weiteren Parameter hinzuzufügen, bei dem es sich um den Namen einer Datei handelt, deren Wörter gezählt werden sollen. Hinweis: Parameterlisten zu 'execl()' sollten mit einem NULL-Parameter enden. Hinweis: Wenn der Elternprozess beendet wird, wird der untergeordnete Prozess (falls er nicht bereits beendet wurde, was in diesem Szenario nicht beendet wurde) in einen "Zombie" -Prozess umgewandelt, der einen Neustart erfordert. – user3629249
Beim Aufrufen von 'fork()' gibt es drei Rückgabewerte, nicht nur zwei (I.E. -1 bei Fehler) Der Code muss den Rückgabewert -1 ordnungsgemäß verarbeiten. – user3629249