Linux中进程间通信:共享内存使用(收藏)

Linux给我们提供了丰富的内部进程通信机制,包括共享内存、内存映射文件、先入先出(FIFO)、接口(sockets)以及多种用于同步的标识。
    一般来说,内部进程通信(interprocess communication)也就是IPC,是指两个或两个以上进程以及两个或者两个以上线程之间进行通信联系。每个IPC机制都有不同的强项或者弱点,不过没有一个IPC机制包含内建的同步方法。因此程序员不但需要自己在程序中实现同步,而且还需要为了利用IPC机制而自己开发通信协议。

共享内存
-----------------------------------------------------------
    使用共享内存和使用malloc()来分配内存区域很相似。使用共享内存的方法是:
    1 对一个进程/线程使用shmget()分配内存区域。
    2 使用shmat()放置一个或多个进程/线程在共享内存中,也可以用shmctl()来获取信息或者控制共享区域。
    3 使用shmdt()从共享区域中分离。
    4 使用shmctl()解除分配空间

    共享内存是Linux中最快速的IPC方法。它也是一个双向过程,共享区域内的任何进程都可以读写内存。这个机制的不利方面是其同步和协议都不受程序员控制,必须确保将句柄传递给了子进程和线程。

例程

 1 -----------------------------------------------------------
 2 #include <stdlib.h>
 3 #include <stdio.h>
 4 #include <string.h>
 5 #include <errno.h>
 6 #include <unistd.h>
 7 #include <sys/stat.h>
 8 #include <sys/types.h>
 9 #include <sys/ipc.h>
10 #include <sys/shm.h>
11 #define PERM S_IRUSR|S_IWUSR
12 
13 int main(int argc, char **argv)
14 {
15     key_t shmid;
16     char   *p_addr, *c_addr;
17     pid_t pid;
18     if(argc != 2) {
19         fprintf(stderr, "Usage:%s\n\a", argv[0]);
20         exit(1);
21     }
22     if( (shmid = shmget(IPC_PRIVATE, 1024, PERM)) == -1 )   { //(1)
23         fprintf(stderr, "Create Share Memory Error:%s\n\a", strerror(errno));
24         exit(1);
25     }
26     pid = fork();
27     if(pid > 0) {
28         p_addr = shmat(shmid, 00);
29         memset(p_addr, '\0'1024);
30         strncpy(p_addr, argv[1], 1024);
31         wait(NULL);
32         exit(0);
33     }
34     else if (pid == 0){
35         sleep(1);
36         c_addr = shmat(shmid, 00);
37         printf("Client get %s\n", c_addr);
38         exit(0);
39     }
40 }
41 

 

(1)
IPC_PRIVATE            保证使用唯一ID
S_IRUSR | S_IWUSR      使当前用户可以读写这个区域

运行
-----------------------------------------------------------
$ ./a.out zengxiaolong
Client get zengxiaolong
$ ./a.out zengxiaolong

后记:
    进程通信(IPC)是网络程序的基础,在很多的网络程序当中会大量的使用进程通信的概念和知识.其实进程通信是一件非常复杂的事情,我在这里只是简单的介绍了一下.如果你想学习进程通信的详细知识,最好的办法是自己不断的写程序和看联机手册.

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/niujian228/archive/2009/04/22/4101458.aspx

posted @ 2010-07-02 09:39  Lux  阅读(1353)  评论(0编辑  收藏  举报