Как сохранить живой процесс от одного вызова fork ()? - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть программа, которая создает дочерний процесс из вызова 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 для всей программы.Это возможно?

1 Ответ

0 голосов
/ 06 февраля 2019

В вашем дочернем разделе:

while(1) {

    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);
        }           
    }
    ...

Вы читаете значение single от пользователя, отправляете его родителю, а затем ожидаете результат от родителя.Тем временем родительский объект прочитал первое значение от дочернего элемента и ожидает другое значение, поэтому родительский и дочерний блокировщики заблокированы, ожидая, что другой отправит им что-то.

Вы хотите, чтобы дочерний элемент зацикливал чтение значений до тех пор, покаполучает -1, , затем ждет родителя.

    if (pidVal == 0) {
        printf("Child Process (should be 0): %d\n", pidVal);
        do {
            val = getInput();
            printf("You typed: %d\n", val);
            //Write to parent
            close(fd[0]);
            write(fd[1], &val, sizeof(val));
        } while (val != -1);
        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);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...