Add IPC shared memory sample code
| New file | 
|  |  |  | 
|---|
|  |  |  | #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; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
| New file | 
|  |  |  | 
|---|
|  |  |  | #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; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|