Вилка обрабатывает по порядку с 4 детьми? - PullRequest
0 голосов
/ 21 октября 2018

Я пытаюсь понять команды fork, sleep ....

Я хочу сделать 4 дочерних и одну родительскую операцию именно в этом порядке.Родитель> child1> child4> child2> child3.Задачи этих процессов, как я написал в коде ниже.В этом коде у меня есть 1 родитель, 3 ребенка и 1 внук (child4 - внук).Как я могу совершать транзакции в этом порядке?Я пытался перевести режим ожидания в каждый if, но программа завершилась, не дожидаясь ввода в child2.

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <sys/wait.h>
#include <stdlib.h>

int main(void) 
{ 
int n1 = fork();
int n2 = fork(); 
int input;



if (n1 > 0 && n2 > 0) { 


int n3=fork();

if(n3==0)
{ //3th child

 printf("3th child process id is %d  (parent: %d) \n", getpid(),getppid());

    if(input == getppid()) {
        printf("matched!\n"); }
    else {
        printf("not matched!\n"); }
printf("program ended\n");
}

else {

    printf("parent process id is %d  (parent: %d)\n", getpid(),getppid());
sleep(1);
}

} 
else if (n1 == 0 && n2 > 0) 
{ 
    printf("1th child process id is %d (parent: %d)\n",getpid(),getppid());
FILE * fp;
fp = fopen ("xx.txt", "w+");

printf("file was created...\n");
 sleep(1);


} 
else if (n1 > 0 && n2 == 0) 
{ 

printf("2th child process id is %d (parent: %d) \n", getpid(),getppid());
printf("Enter a key: \n");
scanf("%d",&input);

FILE * fp;
fp = fopen ("xx.txt", "w+");
fprintf(fp, "%d", input);
printf("input has been written to the txt file!\n");

} 
else { 
//4th child

    printf("4th child grandson process id is %d  (parent: %d)\n", getpid(),getppid());
printf("say me password!\n");


} 

return (0); 

}

1 Ответ

0 голосов
/ 21 октября 2018

Вы можете попробовать что-то вроде:

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>

int main(void)
{
    const size_t nb_child = 3;
    size_t children_count = nb_child;

    while (children_count > 0) {

        int pid = fork();

        if (pid == 0) {

            printf("child process id is %d  (parent: %d) \n", getpid(),getppid());
            if (children_count == 1) {
                int pid2 = fork();
                if (pid2 == 0) {
                    printf("child process id is %d  (parent: %d) \n", getpid(),getppid());
                    sleep(2);
                } else
                    wait(NULL);
            }
            return 0;
        } else {
            //father
        }
        children_count--;
    }

    while (children_count != nb_child) {
        wait(NULL);
        children_count++;
    }
    return 0;
}

"Трудная" часть - это дождаться всех детей перед выходом

...