ftok函数详解.docx
- 文档编号:7621840
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:8
- 大小:33.74KB
ftok函数详解.docx
《ftok函数详解.docx》由会员分享,可在线阅读,更多相关《ftok函数详解.docx(8页珍藏版)》请在冰豆网上搜索。
ftok函数详解
系统建立IPC通讯(如消息队列、共享内存时)必须指定一个ID值。
通常情况下,该id值通过ftok函数得到。
ftok原型如下:
key_tftok(char*fname,intid)
fname就时你指定的文件名(该文件必须是存在而且可以访问的),id是子序号,虽然为int,但是只有8个比特被使用(0-255)。
当成功执行的时候,一个key_t值将会被返回,否则-1被返回。
在一般的UNIX实现中,是将文件的索引节点号取出,前面加上子序号得到key_t的返回值。
如指定文件的索引节点号为65538,换算成16进制为0x010002,而你指定的ID值为38,换算成16进制为0x26,则最后的key_t返回值为0x26010002。
查询文件索引节点号的方法是:
ls-i
以下为测试程序:
#include
#include
#include
#defineIPCKEY0x11
intmain(void)
{
inti=0;
for(i=1;i<256;++i)
printf("key=%x\n",ftok("/tmp",i));
return0;
}
在成功获取到key之后,就可以使用该key作为某种方法的进程间通信的key值,例如shmget共享内存的方式。
shmget的函数原型为
intshmget(key_t,size_t,flag);
在创建成功后,就返回共享内存的描述符。
在shmget中使用到的key_t就是通过ftok的方式生成的
实例:
#include
#include
#include
#include
#include
#defineSIZE1024
externinterrno;
intmain()
{
intshmid;
char*shmptr;
//创建共享内存
if((shmid=shmget(IPC_PRIVATE,SIZE,0600))<0)
{
printf("shmgeterror:
%s\n",strerror(errno));
return-1;
}
//将共享内存连接到可用地址上
if((shmptr=(char*)shmat(shmid,0,0))==(void*)-1)
{
printf("shmaterror:
%s\n",strerror(errno));
return-1;
}
memcpy(shmptr,"helloworld",sizeof("helloworld"));
printf("sharememoryfrom%lxto%lx,content:
%s\n",(unsignedlong)shmptr,(unsignedlong)(shmptr+SIZE),shmptr);
//拆卸共享内存
if((shmctl(shmid,IPC_RMID,0)<0))
{
printf("shmctlerror:
%s\n",strerror(errno));
return-1;
}
}
多进程之间共享内存情况:
#include
#include
#include
#include
#include
#include
#include
#include
#defineSIZE1024
externinterrno;
intmain()
{
intshmid;
char*shmptr;
key_tkey;
pid_tpid;
if((pid=fork())<0)
{
printf("forkerror:
%s\n",strerror(errno));
return-1;
}
elseif(pid==0)
{
sleep
(2);
if((key=ftok("/dev/null",1))<0)
{
printf("ftokerror:
%s\n",strerror(errno));
return-1;
}
if((shmid=shmget(key,SIZE,0600))<0)
{
printf("shmgeterror:
%s\n",strerror(errno));
exit(-1);
}
if((shmptr=(char*)shmat(shmid,0,0))==(void*)-1)
{
printf("shmaterror:
%s\n",strerror(errno));
exit(-1);
}
//memcpy(shmptr,"helloworld",sizeof("helloworld"));
printf("child:
pidis%d,sharememoryfrom%lxto%lx,content:
%s\n",getpid(),(unsignedlong)shmptr,(unsignedlong)(shmptr+SIZE
),shmptr);
printf("childprocesssleep2seconds\n");
sleep
(2);
if((shmctl(shmid,IPC_RMID,0)<0))
{
printf("shmctlerror:
%s\n",strerror(errno));
exit(-1);
}
exit(0);
}
//parent
else
{
if((key=ftok("/dev/null",1))<0)
{
printf("ftokerror:
%s\n",strerror(errno));
return-1;
}
if((shmid=shmget(key,SIZE,0600|IPC_CREAT|IPC_EXCL))<0)
{
printf("shmgeterror:
%s\n",strerror(errno));
exit(-1);
}
if((shmptr=(char*)shmat(shmid,0,0))==(void*)-1)
{
printf("shmaterror:
%s\n",strerror(errno));
exit(-1);
}
memcpy(shmptr,"helloworld",sizeof("helloworld"));
printf("parent:
pidis%d,sharememoryfrom%lxto%lx,content:
%s\n",getpid(),(unsignedlong)shmptr,(unsignedlong)(shmptr+SIZE
),shmptr);
printf("parentprocesssleep2seconds\n");
sleep
(2);
if((shmctl(shmid,IPC_RMID,0)<0))
{
printf("shmctlerror:
%s\n",strerror(errno));
exit(-1);
}
}
waitpid(pid,NULL,0);
exit(0);
}
输出为:
系统建立IPC通讯(如消息队列、共享内存时)必须指定一个ID值。
通常情况下,该id值通过ftok函数得到。
ftok原型如下:
key_tftok(char*fname,intid)
fname就时你指定的文件名(该文件必须是存在而且可以访问的),id是子序号,虽然为int,但是只有8个比特被使用(0-255)。
当成功执行的时候,一个key_t值将会被返回,否则-1被返回。
在一般的UNIX实现中,是将文件的索引节点号取出,前面加上子序号得到key_t的返回值。
如指定文件的索引节点号为65538,换算成16进制为0x010002,而你指定的ID值为38,换算成16进制为0x26,则最后的key_t返回值为0x26010002。
查询文件索引节点号的方法是:
ls-i
以下为测试程序:
#include
#include
#include
#defineIPCKEY0x11
intmain(void)
{
inti=0;
for(i=1;i<256;++i)
printf("key=%x\n",ftok("/tmp",i));
return0;
}
在成功获取到key之后,就可以使用该key作为某种方法的进程间通信的key值,例如shmget共享内存的方式。
shmget的函数原型为
intshmget(key_t,size_t,flag);
在创建成功后,就返回共享内存的描述符。
在shmget中使用到的key_t就是通过ftok的方式生成的
实例:
#include
#include
#include
#include
#include
#defineSIZE1024
externinterrno;
intmain()
{
intshmid;
char*shmptr;
//创建共享内存
if((shmid=shmget(IPC_PRIVATE,SIZE,0600))<0)
{
printf("shmgeterror:
%s\n",strerror(errno));
return-1;
}
//将共享内存连接到可用地址上
if((shmptr=(char*)shmat(shmid,0,0))==(void*)-1)
{
printf("shmaterror:
%s\n",strerror(errno));
return-1;
}
memcpy(shmptr,"helloworld",sizeof("helloworld"));
printf("sharememoryfrom%lxto%lx,content:
%s\n",(unsignedlong)shmptr,(unsignedlong)(shmptr+SIZE),shmptr);
//拆卸共享内存
if((shmctl(shmid,IPC_RMID,0)<0))
{
printf("shmctlerror:
%s\n",strerror(errno));
return-1;
}
}
多进程之间共享内存情况:
#include
#include
#include
#include
#include
#include
#include
#include
#defineSIZE1024
externinterrno;
intmain()
{
intshmid;
char*shmptr;
key_tkey;
pid_tpid;
if((pid=fork())<0)
{
printf("forkerror:
%s\n",strerror(errno));
return-1;
}
elseif(pid==0)
{
sleep
(2);
if((key=ftok("/dev/null",1))<0)
{
printf("ftokerror:
%s\n",strerror(errno));
return-1;
}
if((shmid=shmget(key,SIZE,0600))<0)
{
printf("shmgeterror:
%s\n",strerror(errno));
exit(-1);
}
if((shmptr=(char*)shmat(shmid,0,0))==(void*)-1)
{
printf("shmaterror:
%s\n",strerror(errno));
exit(-1);
}
//memcpy(shmptr,"helloworld",sizeof("helloworld"));
printf("child:
pidis%d,sharememoryfrom%lxto%lx,content:
%s\n",getpid(),(unsignedlong)shmptr,(unsignedlong)(shmptr+SIZE
),shmptr);
printf("childprocesssleep2seconds\n");
sleep
(2);
if((shmctl(shmid,IPC_RMID,0)<0))
{
printf("shmctlerror:
%s\n",strerror(errno));
exit(-1);
}
exit(0);
}
//parent
else
{
if((key=ftok("/dev/null",1))<0)
{
printf("ftokerror:
%s\n",strerror(errno));
return-1;
}
if((shmid=shmget(key,SIZE,0600|IPC_CREAT|IPC_EXCL))<0)
{
printf("shmgeterror:
%s\n",strerror(errno));
exit(-1);
}
if((shmptr=(char*)shmat(shmid,0,0))==(void*)-1)
{
printf("shmaterror:
%s\n",strerror(errno));
exit(-1);
}
memcpy(shmptr,"helloworld",sizeof("helloworld"));
printf("parent:
pidis%d,sharememoryfrom%lxto%lx,content:
%s\n",getpid(),(unsignedlong)shmptr,(unsignedlong)(shmptr+SIZE
),shmptr);
printf("parentprocesssleep2seconds\n");
sleep
(2);
if((shmctl(shmid,IPC_RMID,0)<0))
{
printf("shmctlerror:
%s\n",strerror(errno));
exit(-1);
}
}
waitpid(pid,NULL,0);
exit(0);
}
输出为:
shmctl(shmid,IPC_RMID,0)的作用是从系统中删除该恭喜存储段。
因为每个共享存储段有一个连接计数(shmid_ds结构中的shm_nattch),所以除非使用该段的最后一个进程终止与该段脱接,否则不会实际上删除该存储段
shmctl(shmid,IPC_RMID,0)的作用是从系统中删除该恭喜存储段。
因为每个共享存储段有一个连接计数(shmid_ds结构中的shm_nattch),所以除非使用该段的最后一个进程终止与该段脱接,否则不会实际上删除该存储段
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ftok 函数 详解
![提示](https://static.bdocx.com/images/bang_tan.gif)