From 6632fe9c973b5281a359e533a7820961176057fd Mon Sep 17 00:00:00 2001 From: Guo Wenxue <guowenxue@gmail.com> Date: Fri, 07 Dec 2018 23:42:35 +0800 Subject: [PATCH] Add IPC shared memory sample code --- ch6_ipc/shared_mem_write.c | 63 +++++++++++++++++++++++++++++++ ch6_ipc/shared_mem_read.c | 57 ++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+), 0 deletions(-) diff --git a/ch6_ipc/shared_mem_read.c b/ch6_ipc/shared_mem_read.c new file mode 100644 index 0000000..74a4ce5 --- /dev/null +++ b/ch6_ipc/shared_mem_read.c @@ -0,0 +1,57 @@ +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <unistd.h> +#include <stdlib.h> + +#include <sys/types.h> +#include <sys/ipc.h> +#include <sys/shm.h> + +#define FTOK_PATH "/dev/zero" +#define FTOK_PROJID 0x22 + +typedef struct st_student +{ + char name[64]; + int age; +} t_student; + +int main(int argc, char **argv) +{ + key_t key; + int shmid; + int i; + t_student *student; + + if( (key=ftok(FTOK_PATH, FTOK_PROJID)) < 0 ) + { + printf("ftok() get IPC token failure: %s\n", strerror(errno)); + return -1; + } + + shmid = shmget(key, sizeof(t_student), IPC_CREAT|0666); + if( shmid < 0) + { + printf("shmget() create shared memroy failure: %s\n", strerror(errno)); + return -2; + } + + student = shmat(shmid, NULL, 0); + if( (void *)-1 == student ) + { + printf("shmat() alloc shared memroy failure: %s\n", strerror(errno)); + return -2; + } + + for(i=0; i<4; i++) + { + printf("Student '%s' age [%d]\n", student->name, student->age); + sleep(1); + } + + shmctl(shmid, IPC_RMID, NULL); + + return 0; +} + diff --git a/ch6_ipc/shared_mem_write.c b/ch6_ipc/shared_mem_write.c new file mode 100644 index 0000000..f4692c4 --- /dev/null +++ b/ch6_ipc/shared_mem_write.c @@ -0,0 +1,63 @@ +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <unistd.h> +#include <stdlib.h> + +#include <sys/types.h> +#include <sys/ipc.h> +#include <sys/shm.h> + +#define FTOK_PATH "/dev/zero" +#define FTOK_PROJID 0x22 + +typedef struct st_student +{ + char name[64]; + int age; +} t_student; + +int main(int argc, char **argv) +{ + key_t key; + int shmid; + int i; + t_student *student; + + if( (key=ftok(FTOK_PATH, FTOK_PROJID)) < 0 ) + { + printf("ftok() get IPC token failure: %s\n", strerror(errno)); + return -1; + } + + shmid = shmget(key, sizeof(t_student), IPC_CREAT|0666); + if( shmid < 0) + { + printf("shmget() create shared memroy failure: %s\n", strerror(errno)); + return -2; + } + + student = shmat(shmid, NULL, 0); + if( (void *)-1 == student ) + { + printf("shmat() alloc shared memroy failure: %s\n", strerror(errno)); + return -2; + } + + strncpy(student->name, "zhangsan", sizeof(student->name)); + student->age = 18; + + for(i=0; i<4; i++) + { + student->age ++; + printf("Student '%s' age [%d]\n", student->name, student->age); + sleep(1); + } + + shmdt(student); + + shmctl(shmid, IPC_RMID, NULL); + + return 0; +} + -- Gitblit v1.9.1