У меня есть программа, которая создает дочерний процесс из вызова fork ().Ребенок будет непрерывно получать 1-байтовое целочисленное значение от пользователя.Как только целое число было отправлено дочернему элементу, дочерний элемент отправит значение родительскому элементу, используя каналКогда родитель получит значение, он добавит его в массив.-1 отправляется для завершения программы.Как только дочерний элемент отправляет родительское значение -1, родительский элемент суммирует предыдущие значения в массиве и, используя другой канал, отправляет это значение суммы дочернему элементу, в котором дочерний элемент распечатывает его, и завершает программу.
На данный момент это мой код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
//Gets input from the user
int getInput() {
int val; char temp;
scanf("%hhd", &temp);
val = temp;
return val;
}
//Sums the values of the entered numbers and returns it
int finish(int arr[], int i) {
int sum = 0;
for (int j = 0; j < i; j++) {sum+= arr[j];}
return(sum);
}
int main() {
int fd[2], fd2[2], val = 0, i = 0, sum, final = -9999999;
int arr[1000];
pid_t pidVal;
//Pipe for sending numbers from child to parent
pipe(fd);
//Pipe for sending the final sum from parent to child
pipe(fd2);
//Create parent and child processes
pidVal = fork();
//Used to make it run continously until -1 is pressed
while(1) {
//Child Process
if (pidVal == 0) {
printf("Child Process (should be 0): %d\n", pidVal);
val = getInput();
printf("You typed: %d\n", val);
//Write to parent
close(fd[0]);
write(fd[1], &val, sizeof(val));
//Read if parent sends sum yet
close(fd2[1]);
read(fd2[0], &final, sizeof(final));
//If sum sent from parent, print and terminate
if (final != -9999999) {
printf("%d\n", final);
exit(0);
}
}
//Parent Process
if (pidVal > 0) {
printf("I'm the parent (should be > 0): %d\n", pidVal);
//Read what child sent to the pipe
close(fd[1]);
read(fd[0], &val, sizeof(val));
//If exit value recieved
if (val == -1) {
//Sum the numbers sent
sum = finish(arr, i);
//Close read directory
close(fd2[0]);
//Write the sum to the pipe
write(fd2[1], &sum, sizeof(sum));
}
//Not -1 as input
else {
//Collect input
arr[i] = val;
i++;
}
}
}
}
Однако проблема в том, что когда я пытаюсь отправить более одного номера, программа застревает, как вы можете видеть из этого примера вывода:
I'm the parent (should be > 0): 5673
Child Process (should be 0): 0
3 //My Input
You typed: 3
I'm the parent (should be > 0): 5673
1 //My Input
2 //My Input
Я заметил, что дочерний процесс, похоже, не выполняется на второй итерации, а родительский выполняет, что заставляет меня думать, что дочерний процесс завершается после первого запуска.Как я могу сохранить этого ребенка, пока пользователь не введет -1?Что еще более важно, я хочу добиться этой функциональности с помощью только одного родительского и одного дочернего процесса, полученного только из одного вызова fork для всей программы.Это возможно?