IO共享内存作业

该代码示例展示了如何在C语言中通过共享内存创建两个进程,一个用于倒置字符串,另一个按顺序打印。程序使用ftok创建键,shmget获取共享内存,shmat将其映射到用户空间。一个进程等待标志为0时打印字符串,倒置进程在标志为1时反转字符串并设置标志为0,确保打印有序。程序还包括对共享内存的创建、断开映射和删除操作。
摘要由CSDN通过智能技术生成

在共享内存中放入一个字符串“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;
}

结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值