Shared Memory Segments Example

Kategori: Parallel Programming , 21 Ekim 2019 , JanFranco


Shared memory segments kavramını görmüştük. Şimdi bir örnek ile daha iyi anlayalım:


#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;

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

	/* make the key: */
	if ((key = ftok("shmdemo.c", 'R')) == -1) {
		perror("ftok");
		exit(1);
	}

	/* connect to (and possibly 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: */
	data = shmat(shmid, (void *)0, 0);
	if (data == (char *)(-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;
}
Program bir argüman verilerek çalıştırılırsa yazma işlemi, normal çağırılırsa okuma işlemi yapar. ftok fonksiyonu ile bir key oluşturduk ve id'sini key değişkenine atadık. Daha sonra shmget fonksiyonuna bu key'i, en yukarıda değerini 1024 yaptığımız SHM_SIZE'ı ve dosya izinlerini gönderdik. Dönen segment id değerini de shmid değişkenine atadık. Daha sonra shmat fonksiyonuna bu segment id'yi, hangi adressi kullanacağımızı ve izni gönderdik. Adress kısmını 0 yaptık bu şekilde işletim sistemi rastgele boş bir yer belirleyip orayı verecek. İzni de 0 yaptığımız için writing/reading ikisini de yapabileceğiz. Fonksiyon başarılı çalışırsa bir adress dönecektir. Data pointer'ı şu anda o adress'i tutuyor. Eğer fonksiyon hatalı çalışırsa integer olarak -1 dönecektir. Bunu da data == (char*)(-1) şeklinde kontrol edebiliriz. Segmenti oluşturduk ve bağlandık. Artık yazma/okuma işlemlerini yapabiliriz. Eğer argüman gönderilmişse srtncpy fonksiyonu ile data pointerını başlangıç seçip, SHM_SIZE kadar veriyi argv[1]'e yazarız. Eğer argüman gönderilmemişse direk datadan okuma yaparız. Son olarak shmdt fonksiyonu ile segment ile bağlantıyı kestik.


Sonraki Yazı: Message Passing Interface
Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın