Въпрос:
Имам нужда от пояснение/помощ относно моето разбиране за изходите на fork(). Знам как да програмирам по-подробен и по-голям код в c с fork() и да използвам други концепции като pipe, ipc, threads(posix). Но моето разбиране с прогнозиране на изхода за връщане е лошо, поради което се опитвам да разбера това. Вярвам, че моят случай 1 е правилен, но другите ми случаи са двусмислени или подобни на този, защото не съм съвсем стабилен с изхода на fork() .
Познанията ми с програмния изход са прилични, разбирам основни алгоритми, които съдържат for-loop, while-loop, if/else, структури от данни, рекурсивни изходи.
Въпреки това липсват ми познания за това как програмите, използващи fork() точно извеждат и как комбинациите родител/дете обработват точно както е посочено по-долу.
Моят подход:
Първоначално имаме родителски процес, изпълняващ p0, след което pid разклонява дъщерен процес.
Така че всички възможни изходи винаги ще съдържат 0, тъй като num=0 първоначално и преди първия оператор prinf() num не е зададен на друго число.
Вярвам, че времето за изпълнение на родителския и дъщерния процес е произволно, защото може да излезе във всякакъв ред.
случай 1: p0 отпечатва 02, защото може да има случай, когато pid е родител. След това раздвоеният дъщерен процес p1 отпечатва 01. Крайният отговор ще бъде 0201
случай 2: p0 отпечатва 01, защото може да има случай, при който pid е дете (дали е дете на основния процес от ядрото?). Тогава разклоненото дете p1 е родител, така че отпечатва 0102. Крайният отговор ще бъде 0102
случай 3: p0 отпечатва 00, тъй като pid не е дете или родител. Тогава раздвоеното дете p1 отпечатва 12, защото е дете и родител едновременно. Крайният отговор ще бъде 0012.
случай 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