一步一步学Linux C:共享内存通信实例
共享内存是LUNIX 系统中最底层的通信机制,也是最快速的通信机制。共享内存通过两个或多个进程共享同一块内存区域来实现进程间的通信。通常是由一个进程创建一块共享
内存区域,然后多个进程可以对其进行访问,一个进程将要传出的数据存放到共享内存中,另一个或多个进程则直接从共享内存中读取数据。因此这种通信方式是最高效的进程间通信方式。但实际的问题在于,当两个或多个进程使用共享内存进行通信时,同步问题的解决显得尤为重要,否则就会造成因不同进程同时读写一块共享内存中的数据而发生混乱。在通常的情况下,通过使用信号量来实现进程的同步。
以上两个程序是一个进程间通信的例子。这两个程序分别在不同的进程中运行,使用了共享内存进行通信。b从键盘读入数据,存放在共享内存中。a则从共享内存中读取数据,显示到屏幕上。由于没有使两个进程同步,显示的内容将是杂乱无章的,对这一问题的处理将在进一步学习有关同步的操作之后完成。
实例b程序负责向共享内存中写入数据,a程序负责从内存中读出共享的数据,它们之间并没有添加同步操作。
b.c
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/shm.h>
- #include <stdio.h>
- #define BUF_SIZE 1024
- #define MYKEY 25
- int main()
- {
- int shmid;
- char *shmptr;
- if((shmid = shmget(MYKEY,BUF_SIZE,IPC_CREAT)) ==-1)
- {
- printf("shmget error \n");
- exit(1);
- }
- if((shmptr =shmat(shmid,0,0))==(void *)-1)
- {
- printf("shmat error!\n");
- exit(1);
- }
- while(1)
- {
- printf("input:");
- scanf("%s",shmptr);
- }
- exit(0);
- }
a.c
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/shm.h>
- #define BUF_SIZE 1024
- #define MYKEY 25
- int main()
- {
- int shmid;
- char * shmptr;
- if((shmid = shmget(MYKEY,BUF_SIZE,IPC_CREAT)) ==-1)
- {
- printf("shmget error!\n");
- exit(1);
- }
- if((shmptr = shmat(shmid,0,0)) == (void *)-1)
- {
- printf("shmat error!\n");
- exit(1);
- }
- while(1)
- {
- printf("string :%s\n",shmptr);
- sleep(3);
- }
- exit(0);
- }