GNU/Linux >> Belajar Linux >  >> Linux

Cara menggunakan memori bersama dengan Linux di C

Berikut adalah contoh untuk memori bersama :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define SHM_SIZE 1024  /* make it a 1K shared memory segment */

int main(int argc, char *argv[])
{
    key_t key;
    int shmid;
    char *data;
    int mode;

    if (argc > 2) {
        fprintf(stderr, "usage: shmdemo [data_to_write]\n");
        exit(1);
    }

    /* make the key: */
    if ((key = ftok("hello.txt", 'R')) == -1) /*Here the file must exist */ 
{
        perror("ftok");
        exit(1);
    }

    /*  create the segment: */
    if ((shmid = shmget(key, SHM_SIZE, 0644 | IPC_CREAT)) == -1) {
        perror("shmget");
        exit(1);
    }

    /* attach to the segment to get a pointer to it: */
    if ((data = shmat(shmid, NULL, 0)) == (void *)-1) {
        perror("shmat");
        exit(1);
    }

    /* read or modify the segment, based on the command line: */
    if (argc == 2) {
        printf("writing to segment: \"%s\"\n", argv[1]);
        strncpy(data, argv[1], SHM_SIZE);
    } else
        printf("segment contains: \"%s\"\n", data);

    /* detach from the segment: */
    if (shmdt(data) == -1) {
        perror("shmdt");
        exit(1);
    }

    return 0;
}

Langkah-langkah :

  1. Gunakan ftok untuk mengonversi pathname dan project identifier ke System V IPC key

  2. Gunakan shmget yang mengalokasikan segmen memori bersama

  3. Gunakan shmat untuk melampirkan segmen memori bersama yang diidentifikasi oleh shmid ke ruang alamat proses pemanggilan

  4. Lakukan operasi pada area memori

  5. Lepaskan menggunakan shmdt


Ada dua pendekatan:shmget dan mmap . Saya akan berbicara tentang mmap , karena lebih modern dan fleksibel, tetapi Anda dapat melihat man shmget (atau tutorial ini) jika Anda lebih suka menggunakan alat gaya lama.

mmap() fungsi dapat digunakan untuk mengalokasikan buffer memori dengan parameter yang sangat dapat disesuaikan untuk mengontrol akses dan izin, dan mendukungnya dengan penyimpanan sistem file jika perlu.

Fungsi berikut membuat buffer dalam memori yang dapat dibagikan proses dengan turunannya:

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>

void* create_shared_memory(size_t size) {
  // Our memory buffer will be readable and writable:
  int protection = PROT_READ | PROT_WRITE;

  // The buffer will be shared (meaning other processes can access it), but
  // anonymous (meaning third-party processes cannot obtain an address for it),
  // so only this process and its children will be able to use it:
  int visibility = MAP_SHARED | MAP_ANONYMOUS;

  // The remaining parameters to `mmap()` are not important for this use case,
  // but the manpage for `mmap` explains their purpose.
  return mmap(NULL, size, protection, visibility, -1, 0);
}

Berikut ini adalah contoh program yang menggunakan fungsi yang didefinisikan di atas untuk mengalokasikan buffer. Proses induk akan menulis pesan, fork, dan kemudian menunggu anaknya memodifikasi buffer. Kedua proses dapat membaca dan menulis memori bersama.

#include <string.h>
#include <unistd.h>

int main() {
  char parent_message[] = "hello";  // parent process will write this message
  char child_message[] = "goodbye"; // child process will then write this one

  void* shmem = create_shared_memory(128);

  memcpy(shmem, parent_message, sizeof(parent_message));

  int pid = fork();

  if (pid == 0) {
    printf("Child read: %s\n", shmem);
    memcpy(shmem, child_message, sizeof(child_message));
    printf("Child wrote: %s\n", shmem);

  } else {
    printf("Parent read: %s\n", shmem);
    sleep(1);
    printf("After 1s, parent read: %s\n", shmem);
  }
}

Linux
  1. Bagaimana saya menggunakan Vagrant dengan libvirt

  2. Cara menggunakan BusyBox di Linux

  3. Cara menggunakan Perintah Su di Linux

  1. Bagaimana saya menggunakan cron di Linux

  2. Perintah SCP di Linux:Cara Menggunakannya, dengan Contoh

  3. Cara Menggunakan Perintah RMmod Di Linux Dengan Contoh

  1. Cara Menggunakan Perintah Hexdump Linux dengan Contoh Praktis

  2. Cara menggunakan perintah Vmstat di Linux dijelaskan dengan contoh

  3. Cara menghapus penggunaan non-root dengan UID 0 di Linux