全部博文(71)
分类: 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.cuid或shm_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 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_id:262147
当建立共享内存区并把连接到该共享内存区,我就可以通过往该区域写或读来进程进程间通信。我们可以把该区域当成用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 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 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