Вопрос:
Мне нужно разъяснение / помощь в моем понимании выходных данных fork (). Я знаю, как программировать более подробный и крупный код на c с помощью fork () и использовать другие концепции, такие как pipe, ipc, thread (posix). Но я плохо разбираюсь в прогнозировании результатов возврата, поэтому я пытаюсь это понять. Я считаю, что мой случай 1 верен, но другие мои случаи неоднозначны или похожи на него, потому что я не совсем уверен в выводе fork () .
Я неплохо разбираюсь в выводе программ, я понимаю базовые алгоритмы, которые содержат цикл for, while, if / else, структуры данных, рекурсивные выводы.
Однако мне не хватает знаний о том, как программы, использующие fork (), точно выводят и как комбинации родительских / дочерних процессов в точности соответствуют указанным ниже.
Мой подход:
Первоначально у нас есть родительский процесс, запускающий p0, а затем pid разветвляет дочерний процесс.
Таким образом, все возможные выходные данные всегда будут содержать 0, потому что изначально num = 0 и перед первым оператором prinf () num не установлен на какое-либо другое число.
Я считаю, что время выполнения родительского и дочернего процессов случайное, потому что оно может происходить в любом порядке.
case 1: p0 печатает 02, потому что может быть случай, когда pid является родительским. Затем разветвленный дочерний процесс p1 выводит 01. Окончательный ответ будет 0201.
случай 2: p0 печатает 01, потому что может быть случай, когда pid является дочерним (является ли он дочерним по отношению к основному процессу ядра?). Затем разветвленный дочерний элемент p1 является родителем, поэтому он печатает 0102. Окончательный ответ будет 0102.
case 3: p0 печатает 00, поскольку pid не является дочерним или родительским. Затем разветвленный дочерний элемент p1 выводит 12, потому что он является дочерним и родительским одновременно. Окончательный ответ - 0012.
case 4: p0 печатает 00, поскольку он не является родительским или дочерним. Затем разветвленный дочерний процесс p1 выводит 21, потому что он может быть родителем и потомком одновременно. Окончательный ответ - 0021.
Код:
#include <stdio.h>
int num = 0 ;
int main(int argc, char *argv[])
{
int pid ;
pid = fork() ;
printf("%d",num) ;
if (pid == 0) {
num = 1;
} else if (pid > 0) {
num = 2 ;
}
printf("%d",num) ;
}
Ответ: 0102 или 0012 или 0201 или 0021
printf
наstdout
. Больше нечего. - person Red Alert   schedule 21.02.2015fork
, а также как и когда его использовать. - person Basile Starynkevitch   schedule 21.02.20150
перед1
или2
, то число0
никогда не будет напечатано после того, как вы напечатаете либо1
, либо2
. Это означает, что дело0120
получить невозможно. - person Some programmer dude   schedule 21.02.2015