[SOLVED] Итак, для этой практики я был назначен, мы практикуем контроль над процессом. Мне просто интересно, почему кажется, что мой дочерний процесс никогда не будет выполняться (когда child_pid == 0). Любая помощь по этому вопросу будет принята с благодарностью! Кроме того, safe_fork() - это функция, которую написал наш инструктор, чтобы не открывать студентам слишком много процессов.C - Детский процесс не выполняется
#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;
}
При вызове какого-либо семейства функций 'scanf()' всегда проверяйте возвращаемое значение (а не значения параметра), чтобы убедиться, что операция прошла успешно. при вызове какого-либо из семейства функций 'exec()' они возвращаются, только если произошла ошибка, поэтому следуйте за вызовом с помощью: 'perror (« exec ?? failed »); exit (1); ' – user3629249
Родительский процесс должен вызывать' waitpid (child_pid, NULL); перед возвращением. В текущем сценарии ребенок никогда не вернется, потому что никакой файл/вход не передается функции 'wc', поэтому он будет сидеть вечно, глядя на stdin для ввода.Предложите добавить еще один параметр, который является именем файла, эти слова должны быть подсчитаны. Примечание: список параметров для 'execl()' должен заканчиваться параметром NULL. Примечание: выход из родительского процесса приводит к тому, что дочерний процесс (если он еще не вышел из него, который в этом сценарии не вышел) в процесс «zombie», требуя перезагрузки для устранения. – user3629249
При вызове 'fork()' существует три возвращаемых значения, а не только два, (I.E. -1 при ошибке). Код должен правильно обрабатывать возвращаемое значение -1. – user3629249