LINUX.ORG.RU

Нюансы работы fork

 , , ,


0

1

Есть такая программа:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
 pid_t pid, ppid, a = 0;
 pid_t child_id = fork();
 printf("First fork id id:%d\n", (int) child_id);
 printf("Second fork id%d\n", child_id = (int)fork());
 printf("*PID:%d PPID:%d\n", pid = (int)getpid(), ppid = (int)getppid());
}


Если рассуждать логически, то у нас есть два вызова fork, которые порождают четыре процесса, и три printf. По моей логике при выполнении программы я должен получить 12 строк (4 процесса умножить на 3 printf), но получается только 10 строк.
Помогите разобраться.

Если рассуждать логически, то один из printf выполняется в двух процессах, а два других в четырёх, итого десять строк вывода.

xaizek ★★★★★ ()
Ответ на: комментарий от generator_mmf

Зависит от их относительного расположения в коде. Форк продолжает выполнение после места вызова в обоих процессах.

xaizek ★★★★★ ()

Всё правильно,

# ./a.out | wc -l
12

DonkeyHot ★★★★★ ()

Если рассуждать логически, то последний абзац не надо было помещать в блок кода, чтобы можно было прочитать что вы там за вопрос задаёте. А так — лениво ползунок двигать.

vodz ★★★★★ ()

Если считать, что printf не буферизует вывод (man setvbuf), должно получиться именно 10 строк (первый printf выполняется в двух процессах, остальные два в четырех каждый). Однако у вас это будет только при выводе на терминал (автоматический line buffering), а при выводе в файл или пайп получите именно 12 строк, хотя это и нелогично (каждый из 4 процессов при возврате из main выведет весь буфер, в котором будет весь вывод каждого процесса с момента запуска — так как он небольшой).

LeninGad ()

тебе же на собеседовании зададут дополнительные вопросы и ты всё равно поплывёшь.

dimon555 ★★★★★ ()
 pid_t child_id = fork();

в родителе child_id приравняется детка1, в детка1 нулю.

 printf("First fork id id:%d\n", (int) child_id);

это в итоге добавит две строки в вывод (их и других строк взаимное расположение астрологически зависит от...)

 printf("Second fork id%d\n", child_id = (int)fork());

это добавит четыре стоки, в двух из которых будет 0 у детка2 и внука1детки1 в других вдух айди детка2 и внука1детки1

 printf("*PID:%d PPID:%d\n", pid = (int)getpid(), ppid = (int)getppid());

тож + 4 строки различных пар:
pidmain,pidщели?
детка1, pidmain
детка2, pidmain
внук1детки1, детка1

как то вот так.

}

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.