Berbagi memori

Memori bersama adalah memori yang dibagi antara dua atau lebih proses. Namun, mengapa kita perlu berbagi memori atau alat komunikasi lainnya?

Untuk mengulangi, setiap proses memiliki ruang alamatnya sendiri, jika ada proses yang ingin berkomunikasi dengan beberapa informasi dari ruang alamatnya sendiri ke proses lain, maka itu hanya mungkin dengan teknik IPC (komunikasi antar proses). Seperti yang sudah kita sadari, komunikasi bisa berada di antara proses terkait atau tidak terkait.

Biasanya, proses komunikasi yang saling berhubungan dilakukan menggunakan Pipes atau Named Pipes. Proses yang tidak terkait (katakanlah satu proses berjalan di satu terminal dan proses lain di terminal lain) komunikasi dapat dilakukan menggunakan Named Pipes atau melalui teknik IPC populer dari Memori Bersama dan Antrian Pesan.

Kami telah melihat teknik IPC dari Pipa dan pipa Bernama dan sekarang saatnya untuk mengetahui teknik IPC yang tersisa yaitu, Memori Bersama, Antrian Pesan, Semaphores, Sinyal, dan Pemetaan Memori.

Di bab ini, kita akan mengetahui semua tentang memori bersama.

Kami tahu bahwa untuk berkomunikasi antara dua atau lebih proses, kami menggunakan memori bersama tetapi sebelum menggunakan memori bersama apa yang perlu dilakukan dengan panggilan sistem, mari kita lihat ini -

  • Buat segmen memori bersama atau gunakan segmen memori bersama yang sudah dibuat (shmget ())

  • Lampirkan proses ke segmen memori bersama yang sudah dibuat (shmat ())

  • Lepaskan proses dari segmen memori bersama yang sudah terpasang (shmdt ())

  • Operasi kontrol pada segmen memori bersama (shmctl ())

Mari kita lihat beberapa detail panggilan sistem yang terkait dengan memori bersama.

#include <sys/ipc.h>
#include <sys/shm.h>

int shmget(key_t key, size_t size, int shmflg)

Panggilan sistem di atas membuat atau mengalokasikan segmen memori bersama Sistem V. Argumen yang perlu dilewatkan adalah sebagai berikut -

Itu first argument, key,mengenali segmen memori bersama. Kuncinya bisa berupa nilai arbitrer atau yang bisa diturunkan dari fungsi library ftok (). Kuncinya juga dapat berupa IPC_PRIVATE, artinya, menjalankan proses sebagai server dan klien (hubungan induk dan anak) yaitu komunikasi proses yang saling terkait. Jika klien ingin menggunakan memori bersama dengan kunci ini, maka itu harus merupakan proses turunan dari server. Selain itu, proses anak perlu dibuat setelah orang tua memperoleh memori bersama.

Itu second argument, size, adalah ukuran segmen memori bersama yang dibulatkan menjadi kelipatan PAGE_SIZE.

Itu third argument, shmflg,menentukan bendera memori bersama yang diperlukan seperti IPC_CREAT (membuat segmen baru) atau IPC_EXCL (Digunakan dengan IPC_CREAT untuk membuat segmen baru dan panggilan gagal, jika segmen sudah ada). Harus melewati izin juga.

Note - Lihat bagian sebelumnya untuk detail tentang izin.

Panggilan ini akan mengembalikan pengenal memori bersama yang valid (digunakan untuk panggilan lebih lanjut dari memori bersama) jika berhasil dan -1 jika terjadi kegagalan. Untuk mengetahui penyebab kegagalan, periksa dengan variabel errno atau fungsi perror ().

#include <sys/types.h>
#include <sys/shm.h>

void * shmat(int shmid, const void *shmaddr, int shmflg)

Panggilan sistem di atas melakukan operasi memori bersama untuk segmen memori bersama Sistem V yaitu, melampirkan segmen memori bersama ke ruang alamat proses panggilan. Argumen yang perlu dilewatkan adalah sebagai berikut -

The first argument, shmid,adalah pengenal segmen memori bersama. Id ini adalah pengenal memori bersama, yang merupakan nilai kembalian dari panggilan sistem shmget ().

The second argument, shmaddr,adalah menentukan alamat lampiran. Jika shmaddr adalah NULL, sistem secara default memilih alamat yang sesuai untuk memasang segmen. Jika shmaddr bukan NULL dan SHM_RND ditentukan di shmflg, lampirkan sama dengan alamat kelipatan SHMLBA (Alamat Batas Bawah) terdekat. Jika tidak, shmaddr harus berupa alamat halaman yang selaras di mana lampiran memori bersama terjadi / dimulai.

The third argument, shmflg, menentukan flag memori bersama yang diperlukan seperti SHM_RND (pembulatan alamat ke SHMLBA) atau SHM_EXEC (memungkinkan konten segmen untuk dieksekusi) atau SHM_RDONLY (melampirkan segmen untuk tujuan hanya-baca, secara default adalah baca-tulis) atau SHM_REMAP (menggantikan pemetaan yang ada dalam kisaran yang ditentukan oleh shmaddr dan berlanjut hingga akhir segmen).

Panggilan ini akan mengembalikan alamat segmen memori bersama yang terpasang saat berhasil dan -1 jika terjadi kegagalan. Untuk mengetahui penyebab kegagalan, periksa dengan variabel errno atau fungsi perror ().

#include <sys/types.h>
#include <sys/shm.h>

int shmdt(const void *shmaddr)

Panggilan sistem di atas melakukan operasi memori bersama untuk segmen memori bersama Sistem V untuk melepaskan segmen memori bersama dari ruang alamat proses panggilan. Argumen yang perlu disampaikan adalah -

Argumennya, shmaddr, adalah alamat segmen memori bersama yang akan dipisahkan. Segmen yang harus dilepas harus berupa alamat yang dikembalikan oleh panggilan sistem shmat ().

Panggilan ini akan menghasilkan 0 jika berhasil dan -1 jika gagal. Untuk mengetahui penyebab kegagalan, periksa dengan variabel errno atau fungsi perror ().

#include <sys/ipc.h>
#include <sys/shm.h>

int shmctl(int shmid, int cmd, struct shmid_ds *buf)

Panggilan sistem di atas melakukan operasi kontrol untuk segmen memori bersama Sistem V. Argumen berikut harus diteruskan -

Argumen pertama, shmid, adalah pengenal segmen memori bersama. Id ini adalah pengenal memori bersama, yang merupakan nilai kembalian dari panggilan sistem shmget ().

Argumen kedua, cmd, adalah perintah untuk melakukan operasi kontrol yang diperlukan pada segmen memori bersama.

Nilai yang valid untuk cmd adalah -

  • IPC_STAT- Menyalin informasi dari nilai saat ini dari setiap anggota struct shmid_ds ke struktur yang dilewati yang ditunjukkan oleh buf. Perintah ini memerlukan izin baca ke segmen memori bersama.

  • IPC_SET - Menetapkan ID pengguna, ID grup dari pemilik, izin, dll. Yang ditunjukkan oleh struktur buf.

  • IPC_RMID- Menandai segmen yang akan dihancurkan. Segmen dihancurkan hanya setelah proses terakhir melepaskannya.

  • IPC_INFO - Mengembalikan informasi tentang batas memori bersama dan parameter dalam struktur yang ditunjukkan oleh buf.

  • SHM_INFO - Mengembalikan struktur shm_info yang berisi informasi tentang sumber daya sistem yang dipakai oleh memori bersama.

Argumen ketiga, buf, adalah penunjuk ke struktur memori bersama bernama struct shmid_ds. Nilai struktur ini akan digunakan baik untuk set atau get sesuai cmd.

Panggilan ini mengembalikan nilai tergantung pada perintah yang diteruskan. Setelah keberhasilan IPC_INFO dan SHM_INFO atau SHM_STAT mengembalikan indeks atau pengenal segmen memori bersama atau 0 untuk operasi lain dan -1 jika terjadi kegagalan. Untuk mengetahui penyebab kegagalan, periksa dengan variabel errno atau fungsi perror ().

Mari kita simak contoh program berikut ini.

  • Buat dua proses, satu untuk menulis ke dalam memori bersama (shm_write.c) dan lainnya untuk membaca dari memori bersama (shm_read.c)

  • Program melakukan penulisan ke dalam memori bersama dengan proses tulis (shm_write.c) dan membaca dari memori bersama dengan proses membaca (shm_read.c)

  • Dalam memori bersama, proses penulisan, membuat memori bersama berukuran 1K (dan bendera) dan melampirkan memori bersama

  • Proses tulis menulis 5 kali Huruf dari 'A' ke 'E' masing-masing 1023 byte ke dalam memori bersama. Byte terakhir menandakan akhir buffer

  • Proses baca akan membaca dari memori bersama dan menulis ke output standar

  • Tindakan proses membaca dan menulis dilakukan secara bersamaan

  • Setelah selesai menulis, proses tulis diperbarui untuk menunjukkan penyelesaian penulisan ke dalam memori bersama (dengan variabel lengkap di struct shmseg)

  • Proses membaca melakukan pembacaan dari memori bersama dan ditampilkan pada output hingga mendapat indikasi penyelesaian proses tulis (variabel lengkap di struct shmseg)

  • Melakukan proses membaca dan menulis beberapa kali untuk penyederhanaan dan juga untuk menghindari loop tak terbatas dan memperumit program

Berikut adalah kode untuk proses penulisan (Menulis ke Memori Bersama - File: 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;
}

Langkah Kompilasi dan Eksekusi

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

Berikut adalah kode untuk proses membaca (Membaca dari Memori Bersama dan menulis ke output standar - File: 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;
}

Langkah Kompilasi dan Eksekusi

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