Я пишу программу, которая принимает два целочисленных значения от пользователя в качестве входных данных, 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;
}
Я был бы очень признателен за любую помощь. Спасибо!
Один способ синхронизации доступа к ресурсам несколькими процессами может выполняться с помощью семафора. Другой может быть создание канала между родительским и дочерним ... ребенок ждет сообщения «идти вперед» на трубке, которое отправляется родителем при завершении scanf. – TonyB
Посылка вызова в режим сна в начале дочернего процесса является неаккуратным кодированием, но если это то, чего хочет ваш профессор, почему бы вам не сделать это? – rici
@rici Когда я добавляю 'sleep (5)' в начале дочернего процесса, программа только выполняет код родителя и, к сожалению, выходит. –