#include <sys/types.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <cstdio>
#include <cstdlib>
#include <unistd.h>
#include <wait.h>
#define SHMKEY 75
using namespace std;
int shmid,i;
int *addr;
void client(){
shmid = shmget(SHMKEY,1024,0777);//打开共享存储区
//第一次创建完共享内存时,它还不能被任何进程访问,shmat()函数的作用就是用来启动对该共享内存的访问,并把共享内存连接到当前进程的地址空间。
//addr为共享内存的首地址
addr = static_cast<int *>(shmat(shmid, nullptr, 0));//启用存储区,第二个参数为让系统自动选择共享存储区的地址
for (i = 9; i >= 0; i--)
{
while (*addr != -1);//*addr == -1表示server已经阻塞,client这时执行post操作
printf("(client) client pid=%d post at address%d\n",getpid(),*addr);
*addr = i;
}
exit(0);
}
void server(){
shmid = shmget(SHMKEY,1024,0777|IPC_CREAT);
addr = static_cast<int *>(shmat(shmid, nullptr, 0));
do
{
*addr = -1;
while(*addr == -1);//*addr == -1表示client正在执行post操作,需要等待
printf("(server) server pid=%d read at address%d\n",getpid(),*addr);
}while(*addr);
shmctl(shmid,IPC_RMID,nullptr);//撤消共享存储区,归还资源
exit(0);
}
int main(){
while ((i = fork()) == -1);
if(!i){server();}
system("ipcs -m");
while ((i = fork()) == -1);
if(!i){client();}
wait(nullptr);
wait(nullptr);
}
os2.2共享内存进程通讯
最新推荐文章于 2024-08-03 23:00:42 发布