在共享内存中放入一个字符串“1234567”,创建两个进程
1.一个进程倒置
2.另一个进程打印
3.要求打印的结果有序
4.提示:在共享内存中存储一个flag
打印端:
#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<string.h>
#include<stdlib.h>
int main(int argc, const char *argv[])
{
key_t key =ftok("./",2);
if(key < 0)
{
perror("ftok");
return -1;
}
printf("key = %#x\n",key);
//获取共享内存
int shmid=shmget(key,32,IPC_CREAT|0664);
if(shmid < 0)
{
perror("shmget");
return -1;
}
printf("shmid= %d\n",shmid);
//将共享内存映射到用户空间
void *addr=shmat(shmid,NULL,0);
if((void*)-1 ==addr)
{
perror("shmat");
return -1;
}
printf("addr = %p\n",addr);
//在共享内存中存储一个int类型的数据
*(int *)addr = 0;
//在int类型后面存储一个字符串
char *ptr =(char*)addr+4;
strcpy(ptr,"1234567");
int i =0;
while(i < 10)
{
if(0 == *(int *)addr)
{
printf("%s\n",ptr);
*(int *)addr =1;
i++;
}
}
system("ipcs -m");
//断开映射
if(shmdt(addr)<0)
{
perror("shmdt");
return -1;
}
system("ipcs -m");
//删除共享内存
if(shmctl(shmid,IPC_RMID,NULL)<0)
{
perror("shmctl");
return -1;
}
system("ipcs -m");
return 0;
}
倒置端:
#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
int main(int argc, const char *argv[])
{
key_t key =ftok("./",2);
if(key < 0)
{
perror("ftok");
return -1;
}
printf("key = %#x\n",key);
//获取共享内存
int shmid=shmget(key,32,IPC_CREAT|0664);
if(shmid < 0)
{
perror("shmget");
return -1;
}
printf("shmid= %d\n",shmid);
//将共享内存映射到用户空间
void *addr=shmat(shmid,NULL,0);
if((void*)-1 ==addr)
{
perror("shmat");
return -1;
}
printf("addr = %p\n",addr);
char *start,*end;
char tmp;
int i=0;
while(i<10)
{
start =(char *)addr+4;
end =start +strlen(start)-1;
if(1 == *(int *)addr)
{
while(start<end)
{
tmp =*start;
*start = *end;
*end = tmp;
start++;
end--;
}
*(int *)addr =0;
i++;
}
}
system("ipcs -m");
sleep(3);
//断开映射
if(shmdt(addr)<0)
{
perror("shmdt");
return -1;
}
system("ipcs -m");
//删除共享内存
if(shmctl(shmid,IPC_RMID,NULL)<0)
{
perror("shmctl");
return -1;
}
system("ipcs -m");
return 0;
}
结果: