यह, एक तकनीकी सवाल की तरह है हो सकता है आप मेरी मदद कर सकते हैं यदि आप सी और यूनिक्स के बारे में पता है (या शायद यह एक बहुत नौसिखिया सवाल है!)कांटा के बाद संकेत() के बारे में
एक सवाल आज आया था, जबकि हमारे ऑपरेटिव सिस्टम कोर्स में कुछ कोड का आकलन करना। हम सीख रहे हैं कि यूनिक्स में एक प्रक्रिया को "फोर्क" करने का क्या अर्थ है, हम पहले ही जानते हैं कि यह वर्तमान प्रक्रिया की एक प्रतिलिपि बनाता है और उनके पास अलग-अलग डेटा अनुभाग हैं।
लेकिन फिर मैंने सोचा कि शायद, अगर कोई एक चर और एक पॉइंटर बनाता है जो फोर्क() करने से पहले इंगित करता है, क्योंकि पॉइंटर चर के स्मृति पते को संग्रहीत करता है, तो कोई उस चर के मान को संशोधित करने का प्रयास कर सकता है उस सूचक का उपयोग करके बच्चे की प्रक्रिया।
जनक:
#include <stdio.h> #include <sys/types.h> #include <stdlib.h> int main(){ int value = 0; int * pointer = &value; int status; pid_t pid; printf("Parent: Initial value is %d\n",value); pid = fork(); switch(pid){ case -1: //Error (maybe?) printf("Fork error, WTF?\n"); exit(-1); case 0: //Child process printf("\tChild: I'll try to change the value\n\tChild: The pointer value is %p\n",pointer); (*pointer) = 1; printf("\tChild: I've set the value to %d\n",(*pointer)); exit(EXIT_SUCCESS); break; } while(pid != wait(&status)); //Wait for the child process printf("Parent: the pointer value is %p\nParent: The value is %d\n",pointer,value); return 0; }
आप इसे चलाते हैं, तो आप इस तरह कुछ मिल जाएगा:
हम कक्षा में एक कोड इस के समान करने की कोशिश की प्रारंभिक मान 0
है बच्चा: मैं मूल्य
बच्चे को बदलने की कोशिश करूंगा: सूचक मूल्य 0x7fff733b0c6c
बाल: मैं 1
जनक के लिए मूल्य निर्धारित किया है: मूल्य 0
यह स्पष्ट है कि बच्चे की प्रक्रिया को प्रभावित नहीं किया है: सूचक मूल्य 0x7fff733b0c6c
जनक है सभी मूल प्रक्रिया पर। स्पष्ट रूप से, मुझे कुछ "सेगमेंटेशन गलती" त्रुटि की उम्मीद नहीं थी, क्योंकि स्वीकृत स्मृति पता तक पहुंचने की वजह से। लेकिन वास्तव में क्या हुआ?
याद रखें, मैं प्रक्रियाओं को संवाद करने का कोई तरीका नहीं ढूंढ रहा हूं, यह बात नहीं है। मैं क्या जानना चाहता हूं कि कोड क्या करता है। बाल प्रक्रिया के अंदर, परिवर्तन दिखाई दे रहा है, इसलिए यह कुछ छिपा हुआ है।
मेरा मुख्य परिकल्पना यह है कि पॉइंटर्स स्मृति के लिए पूर्ण नहीं हैं, वे प्रक्रिया के ढेर के सापेक्ष हैं। लेकिन मुझे कोई जवाब नहीं मिला है (कक्षा में कोई भी नहीं जानता था, और गुगलिंग मुझे प्रक्रिया संचार के बारे में कुछ सवाल मिले थे) इसलिए मैं आपसे जानना चाहता हूं, उम्मीद है कि कोई जान जाएगा।
अपना समय पढ़ने के लिए धन्यवाद!
आप 'printf (" अभिभावक: सूचक मूल्य% p \ n मान डाल सकते हैं \ n मूल्य% d \ n ", सूचक, मान);' 'स्विच()' – Haris
http:/के डिफ़ॉल्ट मामले में /en.wikipedia.org/wiki/Virtual_memory – Mat
"* स्पष्ट रूप से, मुझे कुछ" सेगमेंटेशन गलती "त्रुटि की उम्मीद नहीं थी, क्योंकि एक अनुमत स्मृति पता तक पहुंचने के कारण। *" इसका कोई मतलब नहीं है। इसके बारे में सोचो। बच्चा निष्पादित कोड पूरी तरह कानूनी है। एकमात्र सवाल यह है - क्या यह माता-पिता को प्रभावित करता है या नहीं? प्रत्येक प्रक्रिया में –