почему fork () возвращает двойной ноль, если мы используем его первым в if или while - PullRequest
0 голосов
/ 29 мая 2019

Это из моей домашней работы. В коде должно быть 2 процесса, отец и ребенок. Но в коде будет 2 ноля, и он никогда не попадет в ветвь p1> 0. Вот код Я использую fork () и получаю двойной ноль, это сбивает с толку. Я хочу знать, как работает fork () в этом коде.

#include "stdio.h"
#include "unistd.h"
#include "signal.h"
int k1;
void func1(int signo){
    if (signo==SIGUSR2)
    {
        k1=0;
    }

}

int main(int argc, char const *argv[])
{
    int k,p1;
    while (p1=fork()==-1);//one time
    if (p1>0)
    {
        for (k = 1; k < 4; k++)
        {
            printf("parent:pid=%d\n",getpid());
            sleep(1);
        }
        kill(p1,12);
        wait(0);
        printf("OK!\n");
        exit(0);
    }
    else
    {
        signal(12,func1);
        k1=1;
        while (k1==1)
        {
            printf("I'm child\n");
            sleep(1);
        }
        printf("Child forced!\n");
        exit(0);

    }
    return 0;
}

Я хочу знать, как работает fork () в этом коде.

Вывод кода является циклическим выводом: «Я ребенок». Выведите две строки в секунду.

Однако, по моему мнению, должен появиться «parent: pid =% d», но код не попадет в ветку «p1> 0». кажется, что fork () генерирует 2 процесса, но все они имеют p1 = 0.

1 Ответ

1 голос
/ 29 мая 2019

Проблема заключается в приоритетах операторов , == имеет более высокий приоритет, чем =, и, таким образом, while (p1=fork()==-1) анализируется как while (p1=(fork()==-1)). При выполнении этого кода fork успешно и в обеих ветвях возвращается значение, отличное от -1. Вот почему и в дочернем, и в родительском элементах p1 равно 0 (false).

Вам необходимо добавить дополнительные скобки вокруг присваивания: while ((p1=fork())==-1).

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