तो, मुझे क्या करना:अधिकतम ढेर आकार, ulimit -s, segfault 11 - यह कैसे काम करता है?
$ ulimit -s
8192
महान। जैसा कि मैं इसे समझता हूं, किसी भी प्रक्रिया का स्टैक सेगमेंट 8192 किलोबाइट से अधिक नहीं हो सकता है।
अब, चुनौती देने के लिए कि ..
#include <stdio.h>
void over_8k(void) {
char buf[1024*1024*20];
}
int main(int argc, char** argv) {
printf("Starting .. ");
over_8k();
printf(" finishing.\nHow did this work?\n");
return 0;
}
संकलित। भाग गया। कोई समस्या नहीं। वैसे यह सही नहीं है? over_8k
अकेले 20 मेगाबाइट से अधिक, एक ढेर फ्रेम होना चाहिए। ठीक है, उन 20 लाख बाइट्स तक पहुँचने की कोशिश करते हैं:
#include <stdio.h>
#include <string.h>
void over_8k(void) {
char buf[1024*1024*20];
memset(buf, 'A', sizeof(buf));
}
int main(int argc, char** argv) {
printf("Starting .. ");
over_8k();
printf(" finishing.\nHow did this work?\n");
return 0;
}
.. ड्रम रोल ..
Segmentation fault: 11
महान। लेकिन यह वह त्रुटि नहीं है जिसकी मैं अपेक्षा करता हूं? अवैध स्मृति पहुंच?
यह एक सेगफॉल्ट क्यों बढ़ाता है, और इससे पहले कोई त्रुटि नहीं होती है? over_8k
पर कॉल पर शायद? यह कैसे काम करता है? मैं सब कुछ जानना चाहता हूं।
मेरा अनुमान है: आवंटन ढेर अक्सर स्टैक पॉइंटर में वृद्धि/कमी होती है। वह खुद ही segfault नहीं होगा। यह केवल तब होता है जब आप डेटा तक पहुंचने का प्रयास करते हैं, यह अपरिपक्व स्मृति और क्रैश में जाता है। – Mysticial
@ मिस्टिकियल: ठीक है। यह देखना आसान है कि संकलक असेंबली कोड प्रदान करता है। – maverik
उपरोक्त कोड संकलित और परीक्षण करने के लिए आप किस कंपाइलर और झंडे का उपयोग कर रहे हैं? – Matt