ftok函数详解Word下载.docx
《ftok函数详解Word下载.docx》由会员分享,可在线阅读,更多相关《ftok函数详解Word下载.docx(8页珍藏版)》请在冰豆网上搜索。
ls-i
以下为测试程序:
#include<
stdio.h>
sys/types.h>
sys/ipc.h>
#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的方式生成的
实例:
sys/shm.h>
errno.h>
string.h>
stdlib.h>
#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)
shmaterror:
memcpy(shmptr,"
helloworld"
sizeof("
));
printf("
sharememoryfrom%lxto%lx,content:
(unsignedlong)shmptr,(unsignedlong)(shmptr+SIZE),shmptr);
//拆卸共享内存
if((shmctl(shmid,IPC_RMID,0)<
0))
shmctlerror:
多进程之间共享内存情况:
unistd.h>
sys/wait.h>
key_tkey;
pid_tpid;
if((pid=fork())<
forkerror:
elseif(pid==0)
sleep
(2);
if((key=ftok("
/dev/null"
1))<
ftokerror:
if((shmid=shmget(key,SIZE,0600))<
exit(-1);
//memcpy(shmptr,"
child:
pidis%d,sharememoryfrom%lxto%lx,content:
getpid(),(unsignedlong)shmptr,(unsignedlong)(shmptr+SIZE
),shmptr);
childprocesssleep2seconds\n"
);
sleep
(2);
exit(0);
//parent
else
if((shmid=shmget(key,SIZE,0600|IPC_CREAT|IPC_EXCL))<
parent:
getpid(),(unsignedlong)shmptr,(unsignedlong)(shmptr+SIZE
parentprocesssleep2seconds\n"
waitpid(pid,NULL,0);
exit(0);
输出为:
shmctl(shmid,IPC_RMID,0)的作用是从系统中删除该恭喜存储段。
因为每个共享存储段有一个连接计数(shmid_ds结构中的shm_nattch),所以除非使用该段的最后一个进程终止与该段脱接,否则不会实际上删除该存储段