Day07_C语言IO进程线程(重难点)

发布于:2025-07-09 ⋅ 阅读:(19) ⋅ 点赞:(0)

01.思维导图

02.共享内存基本代码(没有考虑同步互斥的情况)

01_memory_w.c

#include <25051head.h>
int main(int argc, const char *argv[])
{
	//1.创建秘钥
	key_t key;
	if(-1==(key=ftok("/home/ubuntu/25041/linux/lj/day25_IO/",'a')))
	{
		ERRLOG("ftok_error");
	}
	//2.创建共享内存
	int shmid=shmget(key,128,IPC_CREAT|0777);
	if(-1==shmid)
	{
		ERRLOG("shmget_error");
	}
	//3.映射
	void* shmaddr=shmat(shmid,NULL,0);
	if((void*)-1==shmaddr)
	{
		ERRLOG("shmat_error");
	}
	char *buf=(char*)shmaddr;
	strcpy(buf,"hello");
	while(1);
#if 0
	while(1){
		memset(buf,0,128);
		printf("请输入>>>>>");
		scanf("%s",buf);
	}
#endif

	//4.断开映射
	if(-1==shmdt(shmaddr))
	{
		ERRLOG("shmdt_error");
	}
	
	//5.删除共享内存
	if(-1==shmctl(shmid,IPC_RMID,NULL))
	{
		ERRLOG("shmctl_error");
	}

	return 0;
}

02_memory_r.c

#include <25051head.h>
int main(int argc, const char *argv[])
{
	//1.创建秘钥
	key_t key;
	if(-1==(key=ftok("/home/ubuntu/25041/linux/lj/day25_IO/",'a')))
	{
		ERRLOG("ftok_error");
	}
	//2.创建共享内存
	int shmid=shmget(key,128,IPC_CREAT|0777);
	if(-1==shmid)
	{
		ERRLOG("shmget_error");
	}
	//3.映射
	void* shmaddr=shmat(shmid,NULL,0);
	if((void*)-1==shmaddr)
	{
		ERRLOG("shmat_error");
	}
	//读取共享内存的数据
	char* buf=(char*)shmaddr;
	printf("buf=[%s]\n",buf);
	while(1);
#if 0
	while(1)
	{
		printf("buf=[%d]\n",buf);
		sleep(1);
	}
#endif

	//4.断开映射
	if(-1==shmdt(shmaddr))
	{
		ERRLOG("shmdt_error");
	}
	
	//5.删除共享内存
	if(-1==shmctl(shmid,IPC_RMID,NULL))
	{
		ERRLOG("shmctl_error");
	}

	return 0;
}

02.共享内存中引入同步互斥

04_memory_w.c

#include <25051head.h>
int main(int argc, const char *argv[])
{
	//1.创建秘钥
	key_t key;
	if(-1==(key=ftok("/home/ubuntu/25041/linux/lj/day25_IO/",'a')))
	{
		ERRLOG("ftok_error");
	}
	//02_01创建信号灯集和共享内存同用同一个秘钥
	int semid=semget(key,2,IPC_CREAT|0777);
	if(semid==-1)
	{
		ERRLOG("semget_error");
	}
	//02_02如果信号灯集中的信号量不做初始化,默认结果为0
	//先查看一下每个信号量的值
#if 0
	unsigned short arr[2];
	if(-1==semctl(semid,200,GETALL,arr))
	{
		ERRLOG("semctl_error");
	}
	printf("arr[0]=%d arr[1]=%d\n",arr[0],arr[1]);
#endif

	//02_03把信号灯集中的两个信号量一个修改为0 一个修改为1
	unsigned short value[2]={0,1};
	semctl(semid,100,SETALL,value);


#if 1
	unsigned short arr[2];
	if(-1==semctl(semid,200,GETALL,arr))
	{
		ERRLOG("semctl_error");
	}
	printf("arr[0]=%d arr[1]=%d\n",arr[0],arr[1]);
#endif

	

	//2.创建共享内存
	int shmid=shmget(key,128,IPC_CREAT|0777);
	if(-1==shmid)
	{
		ERRLOG("shmget_error");
	}
	//3.映射
	void* shmaddr=shmat(shmid,NULL,0);
	if((void*)-1==shmaddr)
	{
		ERRLOG("shmat_error");
	}

	while(1){
		//p(第二个信号);
		struct sembuf sops[2];
		//<0 申请信号量执行P操作 减运算
		sops[0].sem_num=1;
		sops[0].sem_op=-1;
		sops[0].sem_flg=0;

		if(-1==semop(semid,sops,1))
		{
			ERRLOG("semop_error");
		}
		char *buf=(char*)shmaddr;
		printf("请输入:");
		scanf("%s",buf);

		//v(第一个信号);
		sops[1].sem_num=0;
		sops[1].sem_op=1;
		sops[1].sem_flg=0;
		if(-1==semop(semid,sops+1,1))
		{
			ERRLOG("semop_error");
		}
	}


	//4.断开映射
	if(-1==shmdt(shmaddr))
	{
		ERRLOG("shmdt_error");
	}

	//02_06删除信号灯集
	if(-1==semctl(semid,300,IPC_RMID))
	{
		ERRLOG("semctl_error");
	}
	
	//5.删除共享内存
	if(-1==shmctl(shmid,IPC_RMID,NULL))
	{
		ERRLOG("shmctl_error");
	}

	return 0;
}

05_memory_r.c

#include <25051head.h>
int main(int argc, const char *argv[])
{
	//1.创建秘钥
	key_t key;
	if(-1==(key=ftok("/home/ubuntu/25041/linux/lj/day25_IO/",'a')))
	{
		ERRLOG("ftok_error");
	}

	
	//02_01创建信号灯集和共享内存同用同一个秘钥
	int semid=semget(key,2,IPC_CREAT|0777);
	if(semid==-1)
	{
		ERRLOG("semget_error");
	}




	//2.创建共享内存
	int shmid=shmget(key,128,IPC_CREAT|0777);
	if(-1==shmid)
	{
		ERRLOG("shmget_error");
	}
	//3.映射
	void* shmaddr=shmat(shmid,NULL,0);
	if((void*)-1==shmaddr)
	{
		ERRLOG("shmat_error");
	}

	while(1){
		//读取共享内存的数据
		//p(第一信号);

		struct sembuf sops[2];
		//<0 申请信号量执行P操作 减运算
		sops[0].sem_num=0;
		sops[0].sem_op=-1;
		sops[0].sem_flg=0;

		if(-1==semop(semid,sops,1))
		{
			ERRLOG("semop_error");
		}

		char* buf=(char*)shmaddr;
		printf("buf=[%s]\n",buf);
		//v(第二个信号);	
		sops[1].sem_num=1;
		sops[1].sem_op=1;
		sops[1].sem_flg=0;
		if(-1==semop(semid,sops+1,1))
		{
			ERRLOG("semop_error");
		}

	}
	//4.断开映射
	if(-1==shmdt(shmaddr))
	{
		ERRLOG("shmdt_error");
	}


	//02_06删除信号灯集
	if(-1==semctl(semid,300,IPC_RMID))
	{
		ERRLOG("semctl_error");
	}

	
	//5.删除共享内存
	if(-1==shmctl(shmid,IPC_RMID,NULL))
	{
		ERRLOG("shmctl_error");
	}

	return 0;
}

03.共享内存且同步互斥(封装PV操作)

06_memory_w.c

#include <25051head.h>
int main(int argc, const char *argv[])
{
	//1.创建秘钥
	key_t key;
	if(-1==(key=ftok("/home/ubuntu/25041/linux/lj/day25_IO/",'a')))
	{
		ERRLOG("ftok_error");
	}
	//02_01创建信号灯集和共享内存同用同一个秘钥
	int semid=semget(key,2,IPC_CREAT|0664);
	if(semid==-1)
	{
		ERRLOG("semget_error");
	}
	//02_02如果信号灯集中的信号量不做初始化,默认结果为0
	//先查看一下每个信号量的值
#if 0
	unsigned short arr[2];
	if(-1==semctl(semid,200,GETALL,arr))
	{
		ERRLOG("semctl_error");
	}
	printf("arr[0]=%d arr[1]=%d\n",arr[0],arr[1]);
#endif

	//02_03把信号灯集中的两个信号量一个修改为0 一个修改为1
	unsigned short value[2]={0,1};
	semctl(semid,100,SETALL,value);

#if 1
	unsigned short arr[2];
	if(-1==semctl(semid,200,GETALL,arr))
	{
		ERRLOG("semctl_error");
	}
	printf("arr[0]=%d arr[1]=%d\n",arr[0],arr[1]);
#endif

	

	//2.创建共享内存
	int shmid=shmget(key,128,IPC_CREAT|0664);
	if(-1==shmid)
	{
		ERRLOG("shmget_error");
	}
	//3.映射
	void* shmaddr=shmat(shmid,NULL,0);
	if((void*)-1==shmaddr)
	{
		ERRLOG("shmat_error");
	}

	while(1){
		//p(第二个信号);
		//<0 申请信号量执行P操作 减运算
		//
		P(1,-1,semid);

		char *buf=(char*)shmaddr;
		printf("请输入:");
		scanf("%s",buf);

		//v(第一个信号);
		V(0,1,semid);	
	}


	//4.断开映射
	if(-1==shmdt(shmaddr))
	{
		ERRLOG("shmdt_error");
	}


	
	//5.删除共享内存
	if(-1==shmctl(shmid,IPC_RMID,NULL))
	{
		ERRLOG("shmctl_error");
	}

	//02_06删除信号灯集
	if(-1==semctl(semid,300,IPC_RMID))
	{
		ERRLOG("semctl_error");
	}

	return 0;
}

07_memory_r.c

#include <25051head.h>
int main(int argc, const char *argv[])
{
	//1.创建秘钥
	key_t key;
	if(-1==(key=ftok("/home/ubuntu/25041/linux/lj/day25_IO/",'a')))
	{
		ERRLOG("ftok_error");
	}

	
	//02_01创建信号灯集和共享内存同用同一个秘钥
	int semid=semget(key,2,IPC_CREAT|0664);
	if(semid==-1)
	{
		ERRLOG("semget_error");
	}




	//2.创建共享内存
	int shmid=shmget(key,128,IPC_CREAT|0664);
	if(-1==shmid)
	{
		ERRLOG("shmget_error");
	}
	//3.映射
	void* shmaddr=shmat(shmid,NULL,0);
	if((void*)-1==shmaddr)
	{
		ERRLOG("shmat_error");
	}

	while(1){
		//读取共享内存的数据
		//p(第一信号);
		//<0 申请信号量执行P操作 减运算
		P(0,-1,semid);

		char* buf=(char*)shmaddr;
		printf("buf=[%s]\n",buf);
		//v(第二个信号);	
		V(1,1,semid);
	}

	//4.断开映射
	if(-1==shmdt(shmaddr))
	{
		ERRLOG("shmdt_error");
	}


	//5.删除共享内存
	if(-1==shmctl(shmid,IPC_RMID,NULL))
	{
		ERRLOG("shmctl_error");
	}
	

	//02_06删除信号灯集
	if(-1==semctl(semid,300,IPC_RMID))
	{
		ERRLOG("semctl_error");
	}

	return 0;
}

08_p_v.c

#include <25051head.h>
int P(int sem_num,int sem_op,int semid)
{
	struct sembuf sops[2];
	sops[0].sem_num=sem_num;
	sops[0].sem_op=sem_op;
	sops[0].sem_flg=0;
	if(-1==semop(semid,sops,1))
	{
		ERRLOG("semop_error");
	}

}


int V(int sem_num,int sem_op,int semid)
{
	struct sembuf sops[2];
	sops[1].sem_num=sem_num;
	sops[1].sem_op=sem_op;
	sops[1].sem_flg=0;
	if(-1==semop(semid,sops+1,1))
	{
		ERRLOG("semop_error");
	}

}

04.生成静态库

05.生成动态库