使用共享内存搭个鹊桥让牛郎织女聊天

使用共享内存,信号量,线程让牛郎织女进行无隙聊天 

/*
本程序目的是使用共享内存,让牛郎
织女可以任意通信,本程序为牛郎端。
*/

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/sem.h>
#include <pthread.h>

static void sem_p(int msqid_sem,int num);//p操作
static void sem_v(int msqid_sem,int num);//v操作

typedef struct shm
{
	char file[1024];
}*shm_c;
/*子线程,用于接受织女发送的话*/
void *Veg(void *arg)
{    
	/***********信号量*************/
	key_t key_sem = ftok("./",3);
	/*牛郎的共享内存信号量键值*/
	int shmid_id = semget(key_sem,2,IPC_CREAT|0777);
	/*信号量的 ID*/

	/***********共享内存**************/
	key_t key= ftok("./",4);
	/*牛郎的共享内存键值*/
	int shmid = shmget(key,100,IPC_CREAT|0777);
	/*获取共享内存的 ID*/
	shm_c ip = shmat(shmid,NULL,SHM_RND);
	/*对共享内存进行映射,返回值为共享内存的首地址*/

	while(1)
	{
		sem_p(shmid_id,0);//p操作,数据-1
 		printf("织女:");
 		printf("%s\n",ip->file);
 		sem_v(shmid_id,1);//v操作,空间+1
	}
}


/*主线程,用于发送牛郎的话*/
int main(int argc, char const *argv[])
{   
	/***********信号量*************/
	key_t key_sem = ftok("./",1);
	/*牛郎的共享内存信号量键值*/
	int shmid_id = semget(key_sem,2,IPC_CREAT|0777);
	/*信号量的 ID*/

	/***********共享内存**************/
	key_t key= ftok("./",2);
	/*牛郎的共享内存键值*/
	int shmid = shmget(key,100,IPC_CREAT|0777);
	/*获取共享内存的 ID*/
	shm_c ip = shmat(shmid,NULL,SHM_RND);
	/*对共享内存进行映射,返回值为共享内存的首地址*/

	semctl(shmid_id,0,SETVAL,0);
 	/*JACk数据元素初始化为0*/
 	semctl(shmid_id,1,SETVAL,1);
 	/*JACK空间元素初始化为1*/
 
	/***************创建线程**************/
	pthread_t thread;
	/*新线程的 TID*/
	pthread_create(&thread,NULL,Veg,NULL);
	/*创建名为Veg线程*/

	while(1)
	{   
		sem_p(shmid_id,1);//p操作,空间-1
 		fgets(ip->file,sizeof(ip->file),stdin);
 		sem_v(shmid_id,0);//v操作,数据+1
	}

	return 0;

}

static void sem_p(int msqid,int num)//p操作
{
	struct sembuf op[1];
	op[0].sem_num = num;
	op[0].sem_op = -1;
	op[0].sem_flg = 0;

	semop(msqid,op,1);	
}

static void sem_v(int msqid,int num)//v操作
{
	struct sembuf op[1];
	op[0].sem_num = num;
	op[0].sem_op = 1;
	op[0].sem_flg = 0;

	semop(msqid,op,1);	
}
/*
本程序目的是使用共享内存,让牛郎
织女可以任意通信,本程序为织女端。
*/

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/sem.h>
#include <pthread.h>

static void sem_p(int msqid_sem,int num);//p操作
static void sem_v(int msqid_sem,int num);//v操作

typedef struct shm
{
	char file[1024];
}*shm_c;
/*子线程,用于接受织女发送的话*/
void *ALT(void *arg)
{    
	/***********信号量*************/
	key_t key_sem = ftok("./",1);
	/*牛郎的共享内存信号量键值*/
	int shmid_id = semget(key_sem,2,IPC_CREAT|0777);
	/*信号量的 ID*/

	/***********共享内存**************/
	key_t key= ftok("./",2);
	/*牛郎的共享内存键值*/
	int shmid = shmget(key,100,IPC_CREAT|0777);
	/*获取共享内存的 ID*/
	shm_c ip = shmat(shmid,NULL,SHM_RND);
	/*对共享内存进行映射,返回值为共享内存的首地址*/

	while(1)
	{
		sem_p(shmid_id,0);//p操作,数据-1
 		printf("牛郎:");
 		printf("%s\n",ip->file);
 		sem_v(shmid_id,1);//v操作,空间+1
	}
}


/*主线程,用于发送牛郎的话*/
int main(int argc, char const *argv[])
{   
	/***********信号量*************/
	key_t key_sem = ftok("./",3);
	/*牛郎的共享内存信号量键值*/
	int shmid_id = semget(key_sem,2,IPC_CREAT|0777);
	/*信号量的 ID*/

	/***********共享内存**************/
	key_t key= ftok("./",4);
	/*牛郎的共享内存键值*/
	int shmid = shmget(key,100,IPC_CREAT|0777);
	/*获取共享内存的 ID*/
	shm_c ip = shmat(shmid,NULL,SHM_RND);
	/*对共享内存进行映射,返回值为共享内存的首地址*/

	semctl(shmid_id,0,SETVAL,0);
 	/*JACk数据元素初始化为0*/
 	semctl(shmid_id,1,SETVAL,1);
 	/*JACK空间元素初始化为1*/

	/***************创建线程**************/
	pthread_t thread;
	/*新线程的 TID*/
	pthread_create(&thread,NULL,ALT,NULL);
	/*创建名为Veg线程*/

	while(1)
	{
		sem_p(shmid_id,1);//p操作,空间-1
 		fgets(ip->file,sizeof(ip->file),stdin);
 		sem_v(shmid_id,0);//v操作,数据+1
	}

	return 0;

}

static void sem_p(int msqid,int num)//p操作
{
	struct sembuf op[1];
	op[0].sem_num = num;
	op[0].sem_op = -1;
	op[0].sem_flg = 0;

	semop(msqid,op,1);	
}

static void sem_v(int msqid,int num)//v操作
{
	struct sembuf op[1];
	op[0].sem_num = num;
	op[0].sem_op = 1;
	op[0].sem_flg = 0;

	semop(msqid,op,1);	
}

编译时要链接外部头文件pthread.h

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值