2016-11-11 5 views
0

[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; 
} 
+0

При вызове какого-либо семейства функций 'scanf()' всегда проверяйте возвращаемое значение (а не значения параметра), чтобы убедиться, что операция прошла успешно. при вызове какого-либо из семейства функций 'exec()' они возвращаются, только если произошла ошибка, поэтому следуйте за вызовом с помощью: 'perror (« exec ?? failed »); exit (1); ' – user3629249

+0

Родительский процесс должен вызывать' waitpid (child_pid, NULL); перед возвращением. В текущем сценарии ребенок никогда не вернется, потому что никакой файл/вход не передается функции 'wc', поэтому он будет сидеть вечно, глядя на stdin для ввода.Предложите добавить еще один параметр, который является именем файла, эти слова должны быть подсчитаны. Примечание: список параметров для 'execl()' должен заканчиваться параметром NULL. Примечание: выход из родительского процесса приводит к тому, что дочерний процесс (если он еще не вышел из него, который в этом сценарии не вышел) в процесс «zombie», требуя перезагрузки для устранения. – user3629249

+0

При вызове 'fork()' существует три возвращаемых значения, а не только два, (I.E. -1 при ошибке). Код должен правильно обрабатывать возвращаемое значение -1. – user3629249

ответ

3

Вот предложение, проверьте child_pid == 0 явно потому что это также может быть так, что ваша функция safe_fork() не удалось, а также проверить эти ошибки, то есть child_pid < 0. Добавить отладочные PRINTF в проверьте контрольный поток, если у вас его уже нет, и, наконец, проверьте, не вызвал ли вызов execl.

Также обратите внимание на это tutorial для создания труб в C и использования их для связи между родительским и дочерним процессом. Поскольку я чувствую, что есть некоторые проблемы с тем, как вы обрабатываете эти файловые дескрипторы. Возможная причина, по которой вы не можете увидеть какой-либо вывод, заключается в том, что wc может все еще ожидать ввода.

И еще одно, что вам, возможно, придется подождать, пока дочерний процесс завершит/сделает что-то полезное или фактически будет запущен до проверки его вывода. Сначала проверьте другие проблемы, прежде чем беспокоиться об этом.

Надеюсь, что это поможет:

0

Да, но нет. Сначала вы должны тщательно понимать значение fork().
fork(): создает дочерний процесс и возвращается в ДВА ПРОЦЕССА с различным значением возврата в каждом. В родительском объекте он всегда возвращает число, присвоенное ОС для идентификатора процесса вновь созданного дочернего элемента. В то же время он возвращается и во вновь созданный дочерний элемент, так как дочерний процесс начнет выполнять код, скопированный из родителя сразу после инструкции fork(). В дочерней вилке всегда возвращается ноль. Поэтому, как правило, после системного вызова fork(), люди проверяют возвращаемое значение fork для дифференциации дочернего процесса и родительского процесса.

В частности, в этом случае после fork() будут выполняться два процесса с одним и тем же кодом и с теми же состояниями программы (за исключением того, что оба будут иметь другое значение, назначенное переменной child_pid). В родительском его значение равно нулю (что соответствует дочернему pid) и в дочернем, его значение равно нулю, поскольку fork возвращает ноль в дочернем элементе. Теперь будет выполнять оба процесса

if (child_pid > 0) 

что справедливо только для родителей, так родительский процесс будет протекать в «если блок» и ложно для ребенка, так он будет непосредственно перейти к другим частям и выполнить блок еще.

Что делать, если id child_process равен нулю?
ОС всегда назначает ненулевое значение для дочернего элемента, так что fork() будет работать. И если вы каким-то образом получили идентификатор дочернего процесса как ноль, то родитель не сможет войти в «if block» и будет выполнять else block, который является таким же, как и child.