Bộ nhớ dùng chung
Bộ nhớ dùng chung là bộ nhớ được chia sẻ giữa hai hoặc nhiều tiến trình. Tuy nhiên, tại sao chúng ta cần chia sẻ bộ nhớ hoặc một số phương tiện giao tiếp khác?
Nhắc lại, mỗi tiến trình đều có không gian địa chỉ riêng, nếu tiến trình nào muốn giao tiếp một số thông tin từ không gian địa chỉ của chính nó với các tiến trình khác thì chỉ có thể thực hiện được với kỹ thuật IPC (inter process Communication). Như chúng ta đã biết, giao tiếp có thể là giữa các quá trình liên quan hoặc không liên quan.
Thông thường, giao tiếp giữa các quá trình liên quan được thực hiện bằng cách sử dụng Ống hoặc Ống có tên. Các quá trình không liên quan (giả sử một quá trình đang chạy trong một đầu cuối và một quá trình khác trong một thiết bị đầu cuối khác) có thể thực hiện giao tiếp bằng cách sử dụng Ống có tên hoặc thông qua các kỹ thuật IPC phổ biến của Bộ nhớ dùng chung và Hàng đợi tin nhắn.
Chúng ta đã xem các kỹ thuật IPC của Đường ống và Đường ống được đặt tên và bây giờ là lúc để biết các kỹ thuật IPC còn lại viz., Bộ nhớ dùng chung, Hàng đợi tin nhắn, Semaphores, Tín hiệu và Ánh xạ bộ nhớ.
Trong chương này, chúng ta sẽ biết tất cả về bộ nhớ dùng chung.
Chúng ta biết rằng để giao tiếp giữa hai hoặc nhiều tiến trình, chúng ta sử dụng bộ nhớ dùng chung nhưng trước khi sử dụng bộ nhớ dùng chung, những gì cần phải thực hiện với các lệnh gọi hệ thống, chúng ta hãy xem điều này -
Tạo phân đoạn bộ nhớ dùng chung hoặc sử dụng phân đoạn bộ nhớ dùng chung đã được tạo (shmget ())
Đính kèm quy trình vào phân đoạn bộ nhớ chia sẻ đã được tạo (shmat ())
Tách tiến trình khỏi phân đoạn bộ nhớ chia sẻ đã được đính kèm (shmdt ())
Kiểm soát các hoạt động trên phân đoạn bộ nhớ được chia sẻ (shmctl ())
Chúng ta hãy xem xét một vài chi tiết về các lệnh gọi hệ thống liên quan đến bộ nhớ dùng chung.
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg)
Lệnh gọi hệ thống trên tạo hoặc cấp phát một đoạn bộ nhớ dùng chung System V. Các đối số cần được chuyển như sau:
Các first argument, key,nhận ra phân đoạn bộ nhớ được chia sẻ. Khóa có thể là một giá trị tùy ý hoặc một giá trị có thể được dẫn xuất từ hàm thư viện ftok (). Khóa cũng có thể là IPC_PRIVATE, có nghĩa là, các quy trình đang chạy với tư cách là máy chủ và ứng dụng khách (mối quan hệ mẹ và con), tức là thông báo quy trình liên quan đến nhau. Nếu máy khách muốn sử dụng bộ nhớ dùng chung với khóa này, thì nó phải là một tiến trình con của máy chủ. Ngoài ra, tiến trình con cần được tạo sau khi cha mẹ có được bộ nhớ dùng chung.
Các second argument, size, là kích thước của phân đoạn bộ nhớ dùng chung được làm tròn thành bội số của PAGE_SIZE.
Các third argument, shmflg,chỉ định / s cờ bộ nhớ chia sẻ bắt buộc như IPC_CREAT (tạo phân đoạn mới) hoặc IPC_EXCL (Được sử dụng với IPC_CREAT để tạo phân đoạn mới và cuộc gọi không thành công, nếu phân đoạn đã tồn tại). Cần phải vượt qua các quyền.
Note - Tham khảo các phần trước để biết chi tiết về các quyền.
Lệnh gọi này sẽ trả về một mã định danh bộ nhớ dùng chung hợp lệ (được sử dụng cho các lệnh gọi khác của bộ nhớ dùng chung) khi thành công và -1 trong trường hợp thất bại. Để biết nguyên nhân của lỗi, hãy kiểm tra với biến errno hoặc hàm perror ().
#include <sys/types.h>
#include <sys/shm.h>
void * shmat(int shmid, const void *shmaddr, int shmflg)
Lệnh gọi hệ thống trên thực hiện thao tác bộ nhớ dùng chung cho đoạn bộ nhớ dùng chung Hệ thống V tức là gắn đoạn bộ nhớ dùng chung vào không gian địa chỉ của quá trình gọi. Các đối số cần được chuyển như sau:
The first argument, shmid,là định danh của đoạn bộ nhớ dùng chung. Id này là định danh bộ nhớ dùng chung, là giá trị trả về của lệnh gọi hệ thống shmget ().
The second argument, shmaddr,là chỉ định địa chỉ đính kèm. Nếu shmaddr là NULL, mặc định hệ thống sẽ chọn địa chỉ phù hợp để đính kèm phân đoạn. Nếu shmaddr không phải là NULL và SHM_RND được chỉ định trong shmflg, thì phần đính kèm bằng địa chỉ của bội số SHMLBA gần nhất (Địa chỉ ranh giới dưới). Nếu không, shmaddr phải là địa chỉ căn chỉnh trang mà tại đó phần đính kèm bộ nhớ được chia sẻ xảy ra / bắt đầu.
The third argument, shmflg, chỉ định cờ / s bộ nhớ được chia sẻ bắt buộc như SHM_RND (làm tròn địa chỉ thành SHMLBA) hoặc SHM_EXEC (cho phép thực thi nội dung của phân đoạn) hoặc SHM_RDONLY (đính kèm phân đoạn cho mục đích chỉ đọc, theo mặc định nó là đọc-ghi) hoặc SHM_REMAP (thay thế ánh xạ hiện có trong phạm vi được chỉ định bởi shmaddr và tiếp tục cho đến khi kết thúc phân đoạn).
Lệnh gọi này sẽ trả về địa chỉ của đoạn bộ nhớ chia sẻ được đính kèm khi thành công và -1 trong trường hợp thất bại. Để biết nguyên nhân của lỗi, hãy kiểm tra với biến errno hoặc hàm perror ().
#include <sys/types.h>
#include <sys/shm.h>
int shmdt(const void *shmaddr)
Lệnh gọi hệ thống ở trên thực hiện hoạt động bộ nhớ dùng chung cho đoạn bộ nhớ dùng chung Hệ thống V để tách đoạn bộ nhớ dùng chung khỏi không gian địa chỉ của quá trình gọi. Đối số cần được thông qua là -
Đối số, shmaddr, là địa chỉ của phân đoạn bộ nhớ dùng chung được tách ra. Phân đoạn được tách ra phải là địa chỉ được trả về bởi lệnh gọi hệ thống shmat ().
Lệnh gọi này sẽ trả về 0 khi thành công và -1 trong trường hợp thất bại. Để biết nguyên nhân của lỗi, hãy kiểm tra với biến errno hoặc hàm perror ().
#include <sys/ipc.h>
#include <sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf)
Lệnh gọi hệ thống trên thực hiện thao tác điều khiển cho một đoạn bộ nhớ dùng chung Hệ thống V. Các đối số sau cần được chuyển:
Đối số đầu tiên, shmid, là định danh của phân đoạn bộ nhớ dùng chung. Id này là định danh bộ nhớ dùng chung, là giá trị trả về của lệnh gọi hệ thống shmget ().
Đối số thứ hai, cmd, là lệnh để thực hiện thao tác điều khiển cần thiết trên phân đoạn bộ nhớ dùng chung.
Giá trị hợp lệ cho cmd là -
IPC_STAT- Sao chép thông tin về các giá trị hiện tại của từng thành viên trong struct shmid_ds vào cấu trúc được trỏ bởi buf. Lệnh này yêu cầu quyền đọc đối với phân đoạn bộ nhớ được chia sẻ.
IPC_SET - Đặt ID người dùng, ID nhóm của chủ sở hữu, quyền, v.v. được trỏ đến theo cấu trúc buf.
IPC_RMID- Đánh dấu phân đoạn bị hủy. Phân đoạn chỉ bị phá hủy sau khi quá trình cuối cùng đã tách nó ra.
IPC_INFO - Trả về thông tin về giới hạn bộ nhớ dùng chung và các tham số trong cấu trúc được trỏ bởi buf.
SHM_INFO - Trả về một cấu trúc shm_info chứa thông tin về tài nguyên hệ thống được tiêu thụ bởi bộ nhớ dùng chung.
Đối số thứ ba, buf, là một con trỏ đến cấu trúc bộ nhớ dùng chung có tên struct shmid_ds. Các giá trị của cấu trúc này sẽ được sử dụng cho cả set hoặc get theo cmd.
Lệnh gọi này trả về giá trị tùy thuộc vào lệnh được truyền. Khi thành công IPC_INFO và SHM_INFO hoặc SHM_STAT trả về chỉ mục hoặc mã định danh của phân đoạn bộ nhớ được chia sẻ hoặc 0 cho các hoạt động khác và -1 trong trường hợp thất bại. Để biết nguyên nhân của lỗi, hãy kiểm tra với biến errno hoặc hàm perror ().
Chúng ta hãy xem xét chương trình mẫu sau đây.
Tạo hai tiến trình, một là để ghi vào bộ nhớ dùng chung (shm_write.c) và một là để đọc từ bộ nhớ dùng chung (shm_read.c)
Chương trình thực hiện ghi vào bộ nhớ dùng chung bằng quá trình ghi (shm_write.c) và đọc từ bộ nhớ dùng chung bằng quá trình đọc (shm_read.c)
Trong bộ nhớ dùng chung, quá trình ghi, tạo bộ nhớ dùng chung có kích thước 1K (và các cờ) và gắn bộ nhớ dùng chung
Quá trình ghi sẽ ghi 5 lần Bảng chữ cái từ 'A' đến 'E', mỗi 1023 byte vào bộ nhớ dùng chung. Byte cuối cùng biểu thị sự kết thúc của bộ đệm
Quá trình đọc sẽ đọc từ bộ nhớ dùng chung và ghi vào đầu ra tiêu chuẩn
Các hành động trong quá trình đọc và ghi được thực hiện đồng thời
Sau khi hoàn thành việc ghi, quá trình ghi sẽ cập nhật để cho biết đã hoàn thành việc ghi vào bộ nhớ dùng chung (với biến hoàn chỉnh trong struct shmseg)
Quá trình đọc thực hiện đọc từ bộ nhớ được chia sẻ và hiển thị trên đầu ra cho đến khi nó nhận được dấu hiệu hoàn thành quá trình ghi (biến hoàn chỉnh trong struct shmseg)
Thực hiện quá trình đọc và ghi một vài lần để đơn giản và cũng để tránh các vòng lặp vô hạn và làm phức tạp chương trình
Sau đây là mã cho quá trình ghi (Ghi vào Bộ nhớ dùng chung - Tệp: shm_write.c)
/* Filename: shm_write.c */
#include<stdio.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/types.h>
#include<string.h>
#include<errno.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#define BUF_SIZE 1024
#define SHM_KEY 0x1234
struct shmseg {
int cnt;
int complete;
char buf[BUF_SIZE];
};
int fill_buffer(char * bufptr, int size);
int main(int argc, char *argv[]) {
int shmid, numtimes;
struct shmseg *shmp;
char *bufptr;
int spaceavailable;
shmid = shmget(SHM_KEY, sizeof(struct shmseg), 0644|IPC_CREAT);
if (shmid == -1) {
perror("Shared memory");
return 1;
}
// Attach to the segment to get a pointer to it.
shmp = shmat(shmid, NULL, 0);
if (shmp == (void *) -1) {
perror("Shared memory attach");
return 1;
}
/* Transfer blocks of data from buffer to shared memory */
bufptr = shmp->buf;
spaceavailable = BUF_SIZE;
for (numtimes = 0; numtimes < 5; numtimes++) {
shmp->cnt = fill_buffer(bufptr, spaceavailable);
shmp->complete = 0;
printf("Writing Process: Shared Memory Write: Wrote %d bytes\n", shmp->cnt);
bufptr = shmp->buf;
spaceavailable = BUF_SIZE;
sleep(3);
}
printf("Writing Process: Wrote %d times\n", numtimes);
shmp->complete = 1;
if (shmdt(shmp) == -1) {
perror("shmdt");
return 1;
}
if (shmctl(shmid, IPC_RMID, 0) == -1) {
perror("shmctl");
return 1;
}
printf("Writing Process: Complete\n");
return 0;
}
int fill_buffer(char * bufptr, int size) {
static char ch = 'A';
int filled_count;
//printf("size is %d\n", size);
memset(bufptr, ch, size - 1);
bufptr[size-1] = '\0';
if (ch > 122)
ch = 65;
if ( (ch >= 65) && (ch <= 122) ) {
if ( (ch >= 91) && (ch <= 96) ) {
ch = 65;
}
}
filled_count = strlen(bufptr);
//printf("buffer count is: %d\n", filled_count);
//printf("buffer filled is:%s\n", bufptr);
ch++;
return filled_count;
}
Các bước biên dịch và thực hiện
Writing Process: Shared Memory Write: Wrote 1023 bytes
Writing Process: Shared Memory Write: Wrote 1023 bytes
Writing Process: Shared Memory Write: Wrote 1023 bytes
Writing Process: Shared Memory Write: Wrote 1023 bytes
Writing Process: Shared Memory Write: Wrote 1023 bytes
Writing Process: Wrote 5 times
Writing Process: Complete
Sau đây là mã cho quá trình đọc (Đọc từ Bộ nhớ dùng chung và ghi vào đầu ra tiêu chuẩn - Tệp: shm_read.c)
/* Filename: shm_read.c */
#include<stdio.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/types.h>
#include<string.h>
#include<errno.h>
#include<stdlib.h>
#define BUF_SIZE 1024
#define SHM_KEY 0x1234
struct shmseg {
int cnt;
int complete;
char buf[BUF_SIZE];
};
int main(int argc, char *argv[]) {
int shmid;
struct shmseg *shmp;
shmid = shmget(SHM_KEY, sizeof(struct shmseg), 0644|IPC_CREAT);
if (shmid == -1) {
perror("Shared memory");
return 1;
}
// Attach to the segment to get a pointer to it.
shmp = shmat(shmid, NULL, 0);
if (shmp == (void *) -1) {
perror("Shared memory attach");
return 1;
}
/* Transfer blocks of data from shared memory to stdout*/
while (shmp->complete != 1) {
printf("segment contains : \n\"%s\"\n", shmp->buf);
if (shmp->cnt == -1) {
perror("read");
return 1;
}
printf("Reading Process: Shared Memory: Read %d bytes\n", shmp->cnt);
sleep(3);
}
printf("Reading Process: Reading Done, Detaching Shared Memory\n");
if (shmdt(shmp) == -1) {
perror("shmdt");
return 1;
}
printf("Reading Process: Complete\n");
return 0;
}
Các bước biên dịch và thực hiện
segment contains :
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
Reading Process: Shared Memory: Read 1023 bytes
segment contains :
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
Reading Process: Shared Memory: Read 1023 bytes
segment contains :
"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
Reading Process: Shared Memory: Read 1023 bytes
segment contains :
"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
Reading Process: Shared Memory: Read 1023 bytes
segment contains :
"EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
Reading Process: Shared Memory: Read 1023 bytes
Reading Process: Reading Done, Detaching Shared Memory
Reading Process: Complete