BLUESKY
一步一个脚印向前走

最近看流程调度的算法的时候,发现自己对共享内存的知识还是很单薄,加上进程间的通信就更难上加难了,
所以在网上找了些资料,对照程序理解了下,还是有不少的收获的,所以就把资料贴出来,收藏下,给自己
以后参考参考:

要使用共享内存,应该有如下步骤:
1.开辟一块共享内存      shmget()
2.允许本进程使用共某块共享内存  shmat()
3.写入/读出
4.禁止本进程使用这块共享内存    shmdt()
5.删除这块共享内存      shmctl()或者命令行下ipcrm

首先,操作共享内存,我们用到了下面的函数
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int     shmget( key_t shmkey , int shmsiz , int flag );
void    *shmat( int shmid , char *shmaddr , int shmflag );
int     shmdt( char *shmaddr );

shmget()是用来开辟/指向一块共享内存的函数。参数定义如下:
key_t shmkey 是这块共享内存的标识符。如果是父子关系的进程间通信的话,这个标识符用IPC_PRIVATE来代替
int shmsiz 是这块内存的大小.
int flag 是这块内存的模式(mode)以及权限标识
模式可取如下值:        新建:IPC_CREAT
                        使用已开辟的内存:IPC_ALLOC
                        如果标识符以存在,则返回错误值:IPC_EXCL
然后将“模式” 和“权限标识”进行“或”运算,做为第三个参数

如:    IPC_CREAT | IPC_EXCL | 0666
这个函数成功时返回共享内存的ID,失败时返回-1。


shmat()是用来允许本进程访问一块共享内存的函数。
int shmid是那块共享内存的ID。
char *shmaddr是共享内存的起始地址
int shmflag是本进程对该内存的操作模式。如果是SHM_RDONLY的话,就是只读模式。其它的是读写模式
成功时,这个函数返回共享内存的起始地址。失败时返回-1。

shmdt()与shmat()相反,是用来禁止本进程访问一块共享内存的函数
参数char *shmaddr是那块共享内存的起始地址
成功时返回0。失败时返回-1。

此外,还有一个用来控制共享内存的shmctl()函数如下:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int     shmctl( int shmid , int cmd , struct shmid_ds *buf );
int shmid是共享内存的ID。
int cmd是控制命令,可取值如下:
        IPC_STAT        得到共享内存的状态
        IPC_SET           改变共享内存的状态
        IPC_RMID        删除共享内存
struct shmid_ds *buf是一个结构体指针。IPC_STAT的时候,取得的状态放在这个结构体中。如果要改变共享内存的状态,用这个结构体指定
返回值:成功:0
                失败:-1

 在使用共享内存,结束程序退出后。如果你没在程序中用shmctl()删除共享内存的话,一定要在命令行下用ipcrm命令删除这块共享内存。你要是不管的话,它就一直在那儿放着了。
简单解释一下ipcs命令和ipcrm命令。

取得ipc信息:
ipcs [-m|-q|-s]
-m      输出有关共享内存(shared memory)的信息
-q      输出有关信息队列(message queue)的信息
-s      输出有关“遮断器”(semaphore)的信息
%ipcs -m

删除ipc
ipcrm -m|-q|-s shm_id
%ipcrm -m 105

posted on 2007-11-17 19:05 LG 阅读(2261) 评论(0)  编辑 收藏 引用 所属分类: UnixProgram

<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

相册

最新评论