Функции, которые не работают одновременно в C - PullRequest
1 голос
/ 26 мая 2020

Я пытаюсь запустить две функции одновременно в C с помощью fork (), по какой-то причине кажется, что c1 выполняется дважды, а c2 никогда не выполняется. Это код:

#include <stdio.h>
#include <unistd.h>


int main(int argc, char *argv[])
{
    void c1();
    void c2(char *argv[]);
    int wait_rv;        /* return value from wait() */
    int child_status;
    int pid1,pid2,pid3,parentPID;

    parentPID = getpid();

    if((pid1 = fork()) == -1)
    {
        fprintf(stderr, "Cannot fork  child1 \n");
    }else{
        c1();
        exit(17);
    }

    if((pid2 = fork()) == -1)
    {
        fprintf(stderr, "Cannot fork  child 2\n");
    }else{
        c2(argv);
        exit(17);
    }

    int i;
    if( argc >= 2 )
    {
        printf("The arguments supplied are:\n");
        for(i = 1; i < argc; i++)
        {
            printf("%s\t", argv[i]);
        }
    }
    else
    {
        printf("Please provide the file path as command line argument\n");
    }

    c2(argv);

}

void c1()
{
    int counter = 0;
    float grades[10];
    float result = 0;
    printf("child %d here. Will calculate average marks.\n", getpid());
    printf("Please enter 10 marks: \n");

    do{
        printf("(%d)",counter+1);
        scanf("%f",&grades[counter]);
        counter++;
    }while(counter < 10);

    for(counter;counter>=0;counter--){
        result = result + grades[counter];
    }

    printf("Average: %f",result/10);
}

void c2(char *argv[] ){
    FILE *fptr;
    char ch;
    int wrd=1,charctr=1;
    printf("child %d here. Will execute wc\n", getpid());

    fptr=fopen(argv[1],"r");
    if(fptr==NULL)
    {
        printf(" File does not exist or can not be opened.");
        perror(fptr);
    }
    else
    {
        ch=fgetc(fptr);
        while(ch!=EOF)
        {
            if(ch==' '||ch=='\n')
            {
                wrd++;
            }
            else
            {
                charctr++;
            }
            ch=fgetc(fptr);
        }
        printf("\n The number of words in the  file %s are : %d\n",argv[1],wrd-2);
    }
    fclose(fptr);

}

Это мой результат:

child 27931 here. Will calculate average marks.
Please enter 10 marks:
(1)child 27932 here. Will calculate average marks.
Please enter 10 marks:
(1)1
(2)2
(3)3
(4)4
(5)5
(6)6
(7)7
(8)8
(9)9
(10)10
(2)1
Average: 4.600000-bash-4.1$

по какой-то причине он все запутался и пытается получить одну дополнительную оценку в конце.

1 Ответ

0 голосов
/ 26 мая 2020

Вам нужно сделать что-то вроде этого:

int pid = fork();
// Check if forking failed
if(pid == -1) exit(1);
// If we are in child, run c1
else if(pid == 0) {
    // Code here will ONLY be run by child
    c1(argv);
}
// If we are in parent, run c0
else {
    // Code here will ONLY be run by parent
    c0();
}
// Anything that comes after here will be run by BOTH processes
// unless they exit first

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...