Chinaunix首页 | 论坛 | 博客
  • 博客访问: 218572
  • 博文数量: 71
  • 博客积分: 1420
  • 博客等级: 上尉
  • 技术积分: 952
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-11 14:26
文章存档

2009年(16)

2008年(55)

我的朋友

分类: LINUX

2008-04-16 09:37:48

4

名称:

shmctl

功能:

对共享存储段执行多种操作

头文件:

#include

#inlcude

函数原形:

int shmctl(int shm_id,int command,struct shmid_ds *buf);

参数:

shm_id 共享内存标识码

command 功能选择

buf 指向shmid_ds结构的指针

返回值:

若成功则为0,若出错则为-1

      

 

 

 

 

 

 shmctl提供了对一个共享内存区的多种操作。

       shmid为共享存储的ID,用于内部标识共享存储。cmd参数指定下列命令中的一种,使其在shmid指定的段上执行。

       IPC_STAT      取此段的shmid_ds结构,并将它存放在由buf指向的结果中。

      IPC_SET   buf指向结构中的值设置与此段相关结构中的下列三个字段:shm_perm.uid , shm_perm.gid shm_perm.mode.此命令只对有效用户ID等于shm_perm.cuidshm_perm.uid的进程和具有超级用户特权的用户有效。

       IPC_RMID     从系统中删除该共享存储段。因为每个共享存储段有一个连接计数,所以除非使用该段的最后一个进程终止或与该段脱节,否则不会世界上删除该段。

       SHM_LOCK   将共享存储段锁定在内存中。此命令只能用超级用户执行。

       SGM_UNLOCK 解锁共享存储段。此命令只能用超级用户执行。

       buf是一个指针,它指向一个保存着共享内存的模式状态和访问权限的数据结构。

 

下面是一些程序的例子:

/*shmrmid.c删除共享内存区*/

#include

#include

#include

 

int main(int argc,char **argv)

{

int id;

if(argc!=2)

{

    printf(“usage:shmrmid \n”);

    exit(1);

}

if((id=shmget(ftok(argv[1],0,0))<0)

    perror(“shmget”);

if((shmctl(id,IPC_RMID,NULL))<0)

    perror(“shmctl”);

printf(“shm_id: %d\n”,id);

exit(0);

}

运行结果:

#cc –o shmrmid shmrmid.c

#./shmrmid test

shm_id262147

 

 

当建立共享内存区并把连接到该共享内存区,我就可以通过往该区域写或读来进程进程间通信。我们可以把该区域当成用malloc申请的内存一样操作。

/*shmwrite.c向共享内存区写数据*/

#include

#include

#include

 

main(int argc,char **argv)

{

int i,id;

unsigned char *ptr;

struct shmid_ds buff;

 

if(argc!=2)

{

    printf(“usage:shmread \n”);

    exit(1);

}

if((id=shmget(ftok(argv[1],0),0,0))<0)

    perror(“shmget”);

if((ptr=shmat(id,NULL,0))<0)

    perror(“shmat”);

strcpy(ptr,”hello linux”);

exit(0);

}

#cc- o shmwrite shmwrite.c

#./shmwrite test

该程序向以前我们建立的共享内存区写入“hello linux”,程序没有输出。我们可以通过下面的程序把数据读出。

 

/*shmread.h从共享内存区读出数据*/

#include

#include

#include

 

main(int argc,char **argv)

{

int i,id;

unsigned char *ptr;

struct shmid_ds buff;

 

if(argc!=2)

{

    printf(“usage:shmread \n”);

    exit(1);

}

if((id=shmget(ftok(argv[1],0),0,0))<0)

    perror(“shmget”);

ptr=shmat(id,NULL,0);

printf(“%s\n”,ptr);

exit(0);

}

下面是运行结果:

#cc –o shmread shmread.c

#./shmread test

hello linux

阅读(748) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~