使用共享内存,信号量,线程让牛郎织女进行无隙聊天
/*
本程序目的是使用共享内存,让牛郎
织女可以任意通信,本程序为牛郎端。
*/
#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