سؤال

ونحن بحاجة لمعرفة نتائج البرنامج C التالية:

main()
{
    int pid, k, som;
    som = 0; k = 2;
    pid = fork();
    if(pid == 0)
        k=5;
    else
        wait(0);
    for(int i = 1; i <= k; i++)
        som += i;
    printf("%d", som);
}

وقائي الاول التوقع هو 3. عندما يتم إجراء مكالمة مفترق الطرق، يتم نسخ الذاكرة من العملية، ويذهب كل من برامج التشغيل. ثم تنفيذ عملية طفل، ولكن لا يزال ك يساوي 2. وهكذا في النهاية، أن ينفذ 1 + 2 = 3؛

ولكن عند تنفيذ هذا البرنامج، فإنه النواتج 153. ليس لدي أقرب فكرة لماذا النواتج ذلك.

ويمكن لأحد أن يقول لماذا؟

هل كانت مفيدة؟

المحلول

والسبب هو لديك 2 عمليات الطباعة إلى نفس وحدة التحكم. "شوكة" هو أمر / لينكس يونيكس الذي يسمى مرة واحدة وإرجاع مرتين. واحدة من العائدات تكون في عملية الأصلي الذي دعا شوكة وسيعود PID عملية طفل الذي ولدت. إن عودة الثانية ستكون 0 وهذا يدل على أنه عملية طفل.

واحد من البرامج، والطفل وأعتقد، تنفيذ أول وبحساب 15 كقيمة وطباعة إلى وحدة الماضية. تنفيذ برنامج الأم الثانية بسبب الانتظار (0) وينتج قيمة 3.

نصائح أخرى

وطبعت 15 من الأطفال، و3 من الوالدين.

و(أ) هو الأصل، B هو الطفل، وهنا هي خطوط هامة:

A: pid = fork(); // returns 0 for the child process
A: wait(0);
B: k = 5;
B: for(int i = 1; i <= k; i++) som += i; // som = 15
B: printf("%d", som); // prints 15, B finishes, goes back to A
A: for(int i = 1; i <= k; i++) som += i; // som = 3
A: printf("%d", som); // prints 3

وليس هناك سطر جديد يتم طباعتها بين القيم بحيث يظهر الجواب الوالدين الحق بعد إجابة الطفل.

وصحيحة وجاريد عن سبب القيم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top