यह आप प्रक्रियाओं के बीच स्मृति के भाग साझा करने में सक्षम होने के लिए देख रहे हैं, तो आपको shm_open (2) और mmap (2) देखना चाहिए। एक प्रक्रिया में स्मृति का एक हिस्सा आवंटित करना बहुत आसान है और पथ (shm_open के लिए) को दूसरे में पारित करना और दोनों एक साथ पागल हो सकते हैं। क्रिस हैनसन का उल्लेख है कि यह किसी अन्य प्रक्रिया के पता स्थान में चारों ओर घूमने से कहीं अधिक सुरक्षित है। बेशक, यदि आपके पास दोनों प्रक्रियाओं पर नियंत्रण नहीं है, तो यह आपको बहुत अच्छा नहीं करेगा।
(ध्यान रखें कि shm_open के लिए अधिकतम पथ लंबाई 26 बाइट्स प्रतीत होता हो, हालांकि यह कहीं भी प्रलेखित किया जाना प्रतीत नहीं होता।)
// Create shared memory block
void* sharedMemory = NULL;
size_t shmemSize = 123456;
const char* shmName = "mySharedMemPath";
int shFD = shm_open(shmName, (O_CREAT | O_EXCL | O_RDWR), 0600);
if (shFD >= 0) {
if (ftruncate(shFD, shmemSize) == 0) {
sharedMemory = mmap(NULL, shmemSize, (PROT_READ | PROT_WRITE), MAP_SHARED, shFD, 0);
if (sharedMemory != MAP_FAILED) {
// Initialize shared memory if needed
// Send 'shmemSize' & 'shmemSize' to other process(es)
} else handle error
} else handle error
close(shFD); // Note: sharedMemory still valid until munmap() called
} else handle error
...
Do stuff with shared memory
...
// Tear down shared memory
if (sharedMemory != NULL) munmap(sharedMemory, shmemSize);
if (shFD >= 0) shm_unlink(shmName);
// Get the shared memory block from another process
void* sharedMemory = NULL;
size_t shmemSize = 123456; // Or fetched via some other form of IPC
const char* shmName = "mySharedMemPath";// Or fetched via some other form of IPC
int shFD = shm_open(shmName, (O_RDONLY), 0600); // Can be R/W if you want
if (shFD >= 0) {
data = mmap(NULL, shmemSize, PROT_READ, MAP_SHARED, shFD, 0);
if (data != MAP_FAILED) {
// Check shared memory for validity
} else handle error
close(shFD); // Note: sharedMemory still valid until munmap() called
} else handle error
...
Do stuff with shared memory
...
// Tear down shared memory
if (sharedMemory != NULL) munmap(sharedMemory, shmemSize);
// Only the creator should shm_unlink()
स्रोत
2008-09-15 16:08:25
मुझे विशेष रूप से उस मामले में दिलचस्पी है जहां मैं दूसरी प्रक्रिया को नियंत्रित नहीं करता हूं - यानी यह देखने के लिए कि यह क्या कर रहा है, किसी और के कार्यक्रम के अंदर घूम रहा है। (संभावित रूप से [एएसएलआर को अक्षम करने के बाद] (http://stackoverflow.com/questions/6325537/disabling-aslr-in-mac-os-x-now-leopard)।) –
मुझे समझ में नहीं आता कि आप किस प्रक्रिया का हिस्सा हैं पढ़ना चाहते हैं। क्या आप कोर डंप फाइलों के रूप में दीवार प्रक्रिया पता स्थान प्राप्त करने के लिए करते हैं? आपको धागे और (कभी-कभी) साझा पुस्तकालयों को संभालने के लिए कोड की आवश्यकता होती है। उदाहरण के लिए राम में प्रोग्राम बाइनरी को देखने के लिए आपको (ज्यादातर) इस कोड की आवश्यकता नहीं है। – user2284570
@ user2284570 मुझे एक प्रक्रिया की कामकाजी स्मृति को देखने या छेड़छाड़ करने में दिलचस्पी है, निष्पादन योग्य कोड नहीं। –