(1)int shmget(key_t key, int size, int shmflg),开辟或使用一块共享内存。
(2)void *shmat(int shmid, const void *shmaddr, int shmflg), 将参数shmid所指向的共享内存与当前进程连接。
当使用某共享内存时,需要先使用shmat,达成连接。
(3)int shmdt(const void *shmaddr),将先前用shmat连接的共享内存与当前进程解除连接。参数shmaddr为shmat返回的共享内存的地址。
在完成对共享内存的使用后,需要使用shmdt解除连接。
(4)int shmctl(int shmid, int cmd, struct shmid_ds *buf),控制内存的 *** 作。当cmd为IPC_RMID时,删除shmid所指的共享内存。
这些函数的表头文件为<sys/ipc.h>和<sys/shm.h>
下面给出一个使用共享内存实现进程间通信的例子:进程A开辟一块新的共享内存,进程B修改这个共享内存,进程C打印输出这个共享内存的内容,进程D删除这个共享内存。
进程BCD运行的命令格式为:命令 共享内存ID,如./output 123432。
进程A代码如下:
int main()
{
int shmid
shmid = shmget(IPC_PRIVATE, SIZE, IPC_CREAT | 0600)
if (shmid <0)
{
perror("shmget error")
exit(1)
}
printf("create shared memory OK. shmid=%d/n", shmid)
return 0
}
进程B代码如下:
int main(int argc, char *argv[])
{
int shmid
char *shmaddr
if (argc != 2)
{
perror("argc error/n")
exit(1)
}
shmid = atoi(argv[1])
shmaddr = (char *)shmat(shmid, NULL, 0)
if ((int )shmaddr == -1)
{
perror("shmat error./n")
exit(1)
}
strcpy(shmaddr, "hello, world!")
shmdt(shmaddr)
return 0
}
进程C代码如下:
int main(int argc, char *argv[])
{
int shmid
char *shmaddr
if (argc != 2)
{
printf("argc error/n")
exit(1)
}
shmid = atoi(argv[1])
shmaddr = (char *)shmat(shmid, NULL, 0)
if ((int )shmaddr == -1)
{
perror("shmat error./n")
exit(1)
}
printf("%s/n", shmaddr)
shmdt(shmaddr)
return 0
}
进程D代码如下:
int main(int argc, char *argv[])
{
int shmid
if (argc != 2)
{
perror("argc error/n")
exit(1)
}
shmid = atoi(argv[1])
shmctl(shmid, IPC_RMID, NULL)
return 0
}
分类: 电脑/网络 >>程序设计 >>其他编程语言问题描述:
第一次接触这个,手边又没相关资料.有没有热心的高手给详细的源码? 感激不尽!
解析:
CPEHelper::CPEHelper(PCSTR lpFileName)
{
hFile = INVALID_HANDLE_VALUE
hFile = CreateFileA( lpFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)
}
CPEHelper::CPEHelper(PCWSTR lpFileName)
{
hFile = INVALID_HANDLE_VALUE
hFile = CreateFileW( lpFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)
}
bool CPEHelper::operator !()
{
if (hFile == INVALID_HANDLE_VALUE)
return true
return false
}
CPEHelper::~CPEHelper(void)
{
if(hFile != INVALID_HANDLE_VALUE)
CloseHandle(hFile)
}
bool CPEHelper::MappingFile()
{
hMapFile = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0,NULL)
if (hMapFile == NULL)
return false
lpMapAddress = MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0)
if (lpMapAddress == NULL)
return false
return true
}
void CPEHelper::UnMappingFile()
{
UnmapViewOfFile(lpMapAddress)
CloseHandle(hMapFile)
}
这是我的一个程序中的一段
希望对你有帮助
各个厂家的C++语言有自已的一套进程全局共享变量的方法,不通用,如VC++与C++BUILDER就不一样的,网上可以搜到文章,是其正的全局变量共享。
WINDOWS API 提供了一种通用的全局变量共享办法,就是利用变量与文件
的映射技术实现的,可以搜到 FileMapping技术实现的共享变量的例子
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)