هل يمكن لأي شخص أن يشرح هذا الإخراج (نظام التشغيل)؟

StackOverflow https://stackoverflow.com/questions/4226504

  •  26-09-2019
  •  | 
  •  

سؤال

بينما أدرس دورة نظام التشغيل ، لم أفهم سبب إخراج الكود أدناه مثل هذا

الرمز:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h> 

int main (int argc, const char * argv[]) {

    int value = 5;


    pid_t pid = fork();
    printf("pid = %d \n",pid);
    if (pid == 0){
        value+=15;      
        printf("Value ch :%d \n",value);
    }
    else {
        if (pid > 0) {
            wait(NULL);
            printf("Value pr :%d \n",value);
            exit(1);
        }

    }

    return 0;
}

انتاج:

run
[Switching to process 24752]
Running…
pid = 24756 
pid = 0 
Value ch :20 
Value pr :5 

إذا أصبحت القيمة في الطفل 20 لماذا بعد العودة من قيمة الطفل = إلى 5

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

المحلول

لان fork() يخلق عملية جديدة ، مع مساحة العنوان الخاصة بها. تمتلئ مساحة العنوان هذه بنسخة من محتويات مساحة العنوان الأصلية. لذلك ، فإن التغييرات التي تم إجراؤها في عملية واحدة لا تؤثر على الآخر.

بمعنى آخر ، يرجع السبب في ذلك إلى أن العمليات لا تشارك الذاكرة (إلا إذا كنت تجبرها صراحة على mmap() وهلم جرا).

نصائح أخرى

نظرًا لأن ذاكرة العملية الوالدية يتم نسخها إلى عملية الطفل ولا تؤثر التغييرات الإضافية في ذاكرة عملية الطفل على الوالد. مطبات شوكة هي مثيرة للاهتمام.

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