Это из моей домашней работы. В коде должно быть 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.
Мне жаль. Я отредактировал код, теперь он доступен.
Можете ли вы отредактировать сообщение и добавить фактический результат, а затем ожидаемый результат?
Я добавляю фактический результат. А реальный выход на мой взгляд.
Проблема заключается в приоритет операторов, ==
имеет более высокий приоритет, чем =
, и поэтому while (p1=fork()==-1)
анализируется как while (p1=(fork()==-1))
. Когда Вы запускаете этот код, fork
завершается успешно и в обеих ветвях возвращает значение, отличное от -1. Вот почему и в дочернем, и в родительском p1
равно 0 (ложь).
Вам нужно добавить дополнительные скобки вокруг присваивания: while ((p1=fork())==-1)
.
Где еще этот код? Не в вопросе, конечно.