Создайте процессы как двоичное дерево и заставьте каждого ребенка делать разные вещи - PullRequest
0 голосов
/ 31 мая 2019

Я делаю следующую программу, в которой я создаю различные процессы, как будто они были бинарным деревом, я хочу, чтобы дочерний элемент «слева» делал что-то отличное от дочернего элемента «правого», но он выводит мне 2 дочерних элементов. справа или двое детей слева, и я этого не хочу.

void slice(int dir){
    if (dir == 1) {
        printf("izq ");
        printf("child pid %d   parent pid %d\n",getpid(),getppid());fflush(stdout);
    }
    else if (dir == 2){
        printf("der ");
        printf("child pid %d   parent pid %d\n",getpid(),getppid());fflush(stdout);
    }
}

void vector(int vector[], int length, int niveles){
    for(int i=1;i<=niveles;i++)
    {
    int error = 0;
pid_t child_pid[2] = { -1, -1 };
for (int dir=0; dir<=1; ++dir) {
    child_pid[dir] = fork();
    if (child_pid[dir] == -1) {
        error = 1;
        perror("fork");
    }

    if (child_pid[dir] == 0) { 
       // Here is where you place the code the child should execute.
       slice(dir);
       exit(0);
    }
}

for (int dir=0; dir<=1; ++dir) {
    if (child_pid[dir] == -1)
       continue;

    int status;
    pid_t pid = waitpid(child_pid[dir], &status, 0);
    if (pid == -1) {
        error = 1;
        perror("waitpid");
    }
    else if (WIFSIGNALED(status)) {
        error = 1;
        fprintf(stderr, "Child was killed by signal %d\n", WTERMSIG(status));
    }
    else if (WEXITSTATUS(status) != 0) {
        error = 1;
        fprintf(stderr, "Child exited with error %d\n", WEXITSTATUS(status));
    }
}

if (error)
   exit(1);
   } 
}

Моя цель - вызвать функцию для "izq", которая отличается от "der", сохраняя идею всего двоичного дерева.

1 Ответ

0 голосов
/ 31 мая 2019

Помните, что и родитель, и потомок продолжают выполнение с fork, поэтому вам нужно что-то вроде следующего:

int error = 0;
pit_t child_pid[2] = { -1, -1 };
for (int dir=0; dir<=1; ++dir) {
    child_pid[dir] = fork();
    if (child_pid[dir] == -1) {
        error = 1;
        perror("fork");
    }

    if (child_pid[dir] == 0) { 
       // Here is where you place the code the child should execute.
       exit(0);
    }
}

for (int dir=0; dir<=1; ++dir) {
    if (child_pid[dir] == -1)
       continue;

    int status;
    pid_t pid = waitpid(child_pid[dir], &status, 0);
    if (pid == -1) {
        error = 1;
        perror("waitpid");
    }
    else if (WIFSIGNALED(status)) {
        error = 1;
        fprintf(stderr, "Child was killed by signal %d\n", WTERMSIG(wstatus));
    }
    else if (WEXITSTATUS(status) != 0) {
        error = 1;
        fprintf(stderr, "Child exited with error %d\n", WEXITSTATUS(wstatus));
    }
}

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