创建唯一key值—— ftok
key_t ftok(const char *pathname, int proj_id);
#include <sys/types.h>#include <sys/ipc.h>
功能:
ftok
函数是用于生成一个键值(key_t类型)的函数,这个键值通常用于进程间通信(IPC)机制,如消息队列、共享内存和信号量等参数:
pathname:指定的文件路径名或目录路径名,该文件必须存在且可以访问。
proj_id:子序号,是一个8位整数,范围是0到255
返回值:
成功:key值
失败:-1
#include<sys/ipc.h> #include<sys/types.h> int main { key_t key; const char *pathname="/dev/fd/0";//指定一个存在的文件路径 int proj_id=123;//子序号 key=ftok(pathname,proj_id); if(key==-1) {perror("ftok err");return -1;} return 0; }
补充:
key值是根据pathname的inode号和proj_id的低8位组合而成的。如:0x610109a9
pathname只要是路径中存在的文件即可
创建或共享内存——shmget
int shmget(key_t key, size_t size, int shmflg);
参数:
key:这是共享内存的键值:
ftok()
函数生成一个唯一的键值。
key
的值为IPC_PRIVATE
,则会创建一个新的共享内存段;
key
的值为0且在参数shmflg
中设置了IPC_PRIVATE
标志,则同样会创建一个新的共享内存段。size:指定需要创建或获取的共享内存大小。该大小会被四舍五入到页面大小的倍数。
size_t
是一种无符号整数类型,用于表示对象的大小或数组的索引,其大小取决于平台和编译器。shmflg:共享内存的访问权限控制和其他选项。
返回值:
- 成功:shmid共享内存id(非负整数)
- 失败:返回-1,并设置相应的错误码
查看创建的共享内存的命令:ipcs -m
#include<sys/ipc.h> #include<string.h> int main() { const char *pathname = "/etc/config"; // 选择一个存在的文件路径 int proj_id=1;//设置项目ID key_t key=ftok(pathname,proj_id); if(key==-1) {perror("ftok failed"); return -1;} return 0; ///使用生成key进行进程间通信操作 }
- 在上述示例中,我们通过调用
ftok()
函数将指定的文件路径和项目ID转换成一个唯一的键值。- 注意事项:
- 确保所选的文件路径确实存在,并且进程具有对该文件的访问权限。
proj_id
应选择一个较小的正整数,以避免与其他程序冲突
映射共享内存——shmat
void *shmat(int shmid,const void *shmaddr,int shmflg);
参数:
shmid:
共享内存id号
shmaddr
:附加地址一般NULL,则由系统自动选择一个合适的页面对齐地址来附加共享内存段。
如果
shmaddr
不为NULL,对用户指定地址进行附加
shmflg
:这是共享内存段的访问权限和映射条件。常见的标志包括:
SHM_RDONLY
:只读模式。返回值:
成功:指向共享内存起始地址的指针
失败:返回-1,并设置相应的错误号(void*)-1;
//映射/ char *p= shmat(shmid,NULL,0); if(p==(void*)-1) {perror("shmat err");return -1;} //向共享内存中存放数据 strcpy(p,"world");//shuru scanf("%s",p);//shuru printf("%s",p);//shuchu return 0;
取消映射——shmdt
int shmdt(const void *shmaddr);
参数:要取消的地址
返回值:
成功0;
失败:-1;
shmdt(p);//取消映射 getchar();//阻塞的作用
删除共享内存——shmctl
int shmctl(int shmid,int cmd,struct shmid_ds *buf);
功能:
删除共享内存
参数:
shmid:共享ID
cmd:指定要执行的操作命令:
IPC_STAT
:获取当前共享内存的状态信息,并将这些信息存储在由buf
指向的结构中。IPC_SET
:根据buf
中的参数修改共享内存的属性,如拥有者、组和权限等。IPC_RMID
:删除(释放)指定的共享内存段。buf:NULL
结构体的指针,该结构体定义在
<sys/shm.h>
头文件中。该结构体包含共享内存的各种状态和权限信息。返回值:
- 成功时返回 0。
- 失败时返回 -1,并设置相应的错误代码
#include <sys/ipc.h> #include <sys/shm.h> int main() { key_t key = ftok("example", 65); // 创建一个键值 int shmid = shmget(key, 1024, 0666 | IPC_CREAT); // 获取共享内存标识符 if (shmid == -1) { perror("shmget failed"); return 1; } struct shmid_ds ds; if (shmctl(shmid, IPC_STAT, &ds) == -1) { perror("shmctl failed"); return 1; } printf("共享内存大小: %lu\n", ds.shm _segsz); printf("共享内存权限: %o\n", ds.shm _perm模式); shmctl(shmid, IPC_RMID, NULL); // 删除共享内存 return 0; }