This examples are made two programs.
shm_r.c
This source make and attach a shared memory and then check updating from other process every 1 second. When data updated "END", remove shared memory and process quit.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define DATA_SIZE 2048
int main(void) {
int id;
char *shmData;
char data[DATA_SIZE];
// Shared memory create a new with IPC_CREATE
if((id = shmget(IPC_PRIVATE, DATA_SIZE, IPC_CREAT|0666)) == -1){
perror("shmget()");
exit(-1);
}
printf("Shm ID = %d\n",id);
// Shared memory attach and convert char address
if((shmData = (char *)shmat(id, NULL, 0)) == (void *)-1){
perror("shmat()");
} else {
// Write initial data to shared memory
strcpy(shmData, "INITIALIZED DATA");
memset(data, 0x00, DATA_SIZE);
// Check updateing every a second.
while( 1 ){
// Does shared memory updated?
if (strcmp(shmData, data) != 0) {
printf("%s\n", shmData);
strcpy(data, shmData);
// Does shared memory updated same 'END'?
if (strcmp(data, "END") == 0) {
break;
}
}
sleep( 1 );
}
// Detach shred memory
if(shmdt( shmData )==-1){
perror("shmdt()");
}
}
// Remove shred memory
if(shmctl(id, IPC_RMID, 0)==-1){
perror("shmctl()");
exit(EXIT_FAILURE);
}
return 0;
}
shm_r.c
This source attache created shared memory and then write a message, lastly detach one and self quit. This program needs two arguments. First, shared memory ID. Second to write message. To input shard memory ID is displayed when running shm_r.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int main(int argc, char *argv[]) {
int id;
char *shmData;
if( argc <= 2) {
fprintf(stderr, "Usage: shm_w shm_id string\n");
exit(EXIT_FAILURE);
}
// Attache shared memory
id = atoi(argv[1]);
if((shmData = (char *)shmat(id, 0, 0)) == (void *)-1) {
perror("shmat()");
exit(EXIT_FAILURE);
} else {
strcpy(shmData, argv[2]);
fprintf(stderr, "Written:%s.\n", shmData);
// Detach shared memory
if( shmdt( shmData ) == -1) {
perror("shmdt()");
exit(EXIT_FAILURE);
}
}
return 0;
}
No comments:
Post a Comment