2017-02-13 1 views
0

Я пишу программу, которая принимает два целочисленных значения от пользователя в качестве входных данных, X и Y (для назначения).Как убедиться, что родительский процесс выполняет scanf() до того, как это сделал ребенок?

Сложная часть состоит в том, что программа должна создать родительский элемент и дочерний элемент, где родительский процесс будет читать X, а дочерний процесс будет читать Y (используя scanf).

Ожидаемый результат работы программы заключается в следующем:

From parent 2255: child with PID 2256 is created 
From parent 2255: Reading X from the user 
>> 99 
>> X in parent is 99 
From child: Reading Y from the user 
>> 88 
>> Y in child is 88 

Проблема у меня в том, что ребенок выполняет автоматически, и не ждать, пока вход не будет получен в родителе.

Мой профессор дал нам понять, что мы можем использовать sleep() в начале дочернего процесса для решения этой проблемы, но мне не повезло.

Мой пример кода (который не работает):

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#include <sys/types.h> // pid_t 
#include <unistd.h>  // NULL, fork() 
#include <errno.h>  // errno 

int main(void){ 

    // Initializing variables 
    int X = 0, Y = 0; 

    // Fork 
    pid_t pid;   
    pid = fork(); 

    // ERROR 
    if (pid < 0){ 
     // error handling 
    } 
    // PARENT 
    else if (pid > 0){ 

     // Read X 
     printf("From parent %d: Reading X from the user\n>> ", pid); 
     scanf(" %d", &X); 
     printf("X in parent is %d\n", X); 

     // Some other code afterwards 
    } 
    // CHILD 
    else { 

     // Read Y 
     printf("From child: Reading Y from the user\n>> "); 
     scanf(" %d", &Y); 
     printf("Y in child is %d\n", Y); 

     // Some other code afterwards 
    } 

    return 0; 
} 

Я был бы очень признателен за любую помощь. Спасибо!

+0

Один способ синхронизации доступа к ресурсам несколькими процессами может выполняться с помощью семафора. Другой может быть создание канала между родительским и дочерним ... ребенок ждет сообщения «идти вперед» на трубке, которое отправляется родителем при завершении scanf. – TonyB

+4

Посылка вызова в режим сна в начале дочернего процесса является неаккуратным кодированием, но если это то, чего хочет ваш профессор, почему бы вам не сделать это? – rici

+0

@rici Когда я добавляю 'sleep (5)' в начале дочернего процесса, программа только выполняет код родителя и, к сожалению, выходит. –

ответ

0

родитель может ждать ребенка, чтобы закончить, что-то по следующим направлениям

printf("X in parent is %d\n", X); 

    int status = 0; 
    waitpid(pid, &status, 0); 
    // Some other code afterwards 

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

Если требуется синхронизация между двумя процессами для чтения X & Y и затем выполнить вычисление, тогда рассмотрим использование условной переменной (wait/signal). Что-то вроде родителя ждет при условии, которое установлено дочерним, чтобы родитель мог продолжить работу. Ожидание еще может быть хорошей идеей, если у вас нет заботы о создании процесса зомби (то есть родительский выход без получения статуса его ребенка) или соответствующим образом устанавливает SIGCHLD.

Смежные вопросы