2024/4/9 IOday8

1:将昨天的作业(使用管道让2个终端之间互相聊天),使用消息队列去实现

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <pthread.h>
#include <dirent.h>
#include <semaphore.h>
#include <signal.h>
#include <math.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h>
typedef struct msgbuf{
	long type;
	char text[256];
}msg_t;
void* task(void* arg){
    key_t key2=ftok("./ipc",2);//创建秘钥
	if(key2==-1){
		perror("ftok:");
		return NULL;
	}
	int msgid=msgget(key2,IPC_CREAT | 0664);//
	msg_t buf;
	int len=0;
	while(1){
		memset(&buf,0,sizeof(msg_t));
		len=msgrcv(msgid,&buf,256,2,0);
		printf("读取到终端2消息:%s\n",buf.text);
	}



}
int main(int argc, const char *argv[])
{
	pthread_t id;
	if(pthread_create(&id,NULL,task,NULL)==-1){
		perror("pthread_create:");
		return 1;
	}
	pthread_detach(id);
	key_t key=ftok("./ipc",1);//创建秘钥
	if(key==-1){
		perror("key:");
		return 1;
	}
	int msgid=msgget(key,IPC_CREAT | 0664);
	//根据秘钥访问消息队列,如果不存在,则创建
	msg_t buf;//创建结构体类型变量
	int len=0;
	while(1){
		memset(&buf,0,sizeof(msg_t));//每次循环清空变量
		buf.type=1;
		printf("请输入:");
		scanf("%256s",buf.text);//将输入存入数组
		while(getchar()!=10);
		len=strlen(buf.text);//计算字符串长度
		msgsnd(msgid,&buf,len,0);
		//发送数组内容到消息队列,参数有消息队列id
		//结构体变量,字符串长度,0表示阻塞型IO
	}
	return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <pthread.h>
#include <dirent.h>
#include <semaphore.h>
#include <signal.h>
#include <math.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h>
typedef struct msgbuf{
	long type;
	char text[256];
}msg_t;
void* run(void* arg){
    key_t key2=ftok("./ipc",2);//创建秘钥
	if(key2==-1){
		perror("key:");
		return NULL;
	}
	int msgid=msgget(key2,IPC_CREAT | 0664);
	//根据秘钥访问消息队列,如果不存在,则创建
	msg_t buf;//创建结构体类型变量
	int len=0;
	while(1){
		memset(&buf,0,sizeof(msg_t));//每次循环清空变量
		buf.type=2;
		printf("请输入:");
		scanf("%256s",buf.text);//将输入存入数组
		while(getchar()!=10);
		len=strlen(buf.text);//计算字符串长度
		msgsnd(msgid,&buf,len,0);
		//发送数组内容到消息队列,参数有消息队列id
		//结构体变量,字符串长度,0表示阻塞型IO
	}

}
int main(int argc, const char *argv[])
{
	pthread_t id;
	if(pthread_create(&id,NULL,run,NULL)==-1){
		perror("pthread_create:");
		return 1;
	}
	pthread_detach(id);
	key_t key=ftok("./ipc",1);//创建秘钥
	if(key==-1){
		perror("ftok:");
		return 1;
	}
	int msgid=msgget(key,IPC_CREAT | 0664);//
	msg_t buf;
	int len=0;
	while(1){
		memset(&buf,0,sizeof(msg_t));
		len=msgrcv(msgid,&buf,256,1,0);
		printf("读取到终端1消息:%s\n",buf.text);
	}
	
	return 0;
}

2:将昨天的作业(使用管道让2个终端之间互相聊天) 使用共享内存 + 信号灯集去实现

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <pthread.h>
#include <dirent.h>
#include <semaphore.h>
#include <signal.h>
#include <math.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/sem.h>  
#include <semaphore.h>

void* task(void* arg);
typedef struct shmbuf{
    char text[256];
}shm_t;
void semwait(int id_1,int index){//自定义wait函数
    struct sembuf buf = {0};
    buf.sem_num = index;
    buf.sem_op = -1;
    buf.sem_flg = SEM_UNDO;
    semop(id_1,&buf,1);
}


void sempost(int id_1,int index){//自定义post函数
    struct sembuf buf = {0};
    buf.sem_num = index;
    buf.sem_op = 1;
    buf.sem_flg = SEM_UNDO;
    semop(id_1,&buf,1);
}
int main(int argc, const char *argv[])
{ 
	pthread_t id_a;
	pthread_create(&id_a,NULL,task,NULL);
	pthread_detach(id_a);
	//共享内存写
	key_t key = ftok("./ipc",1);//创建秘钥
    if(key == -1){
        perror("ftok");
        return 1;
    }
	 //创建1个信号等集,该集合中有2个信号量
    int id_1 = semget(key,2,IPC_CREAT | 0666);
    if(id_1 == -1){
        perror("semget");
        return 1;
    }
	// 第0个信号量初始化为0,第1个信号量初始化为1
    semctl(id_1,0,SETVAL,0);
	//***************************************
    int id = shmget(key,256,IPC_CREAT | 0666);
	//根据秘钥创建共享内存id,参数有秘钥,创建的
	//共享内存字节大小,允许创建文件权限
    if(id == -1){
        perror("shmget");
        return 1;
    }
    shm_t* addr = shmat(id,NULL,0);
    // 将共享内存映射到独立内存,参数有共享内存id,NULL
	// 表示随机分配独立内存,0表示内存可读可写
    
    int len = 0;
    while(1){
        printf("请输入数据:");
        scanf("%256s",addr->text);//直接从终端将数据输入到共享内存中去
        while(getchar()!=10);
		sempost(id_1,0);
		
    }
	return 0;
}
void* task(void* arg){
    key_t key2 = ftok("./ipc",2);//创建秘钥
    if(key2 == -1){
        perror("ftok");
        return NULL;
    }
	int id_2 = semget(key2,2,IPC_CREAT | 0666);
    if(id_2 == -1){
        perror("semget");
        return NULL;
    }
    semctl(id_2,1,SETVAL,0);

    int id2 = shmget(key2,256,IPC_CREAT | 0666);
	//创建共享内存id
    if(id2 == -1){
        perror("shmget");
        return NULL;
    }
    shm_t* addr = shmat(id2,NULL,0);
    // 映射独立内存
	int len = 0;
	while(1){
		semwait(id_2,0);	
        printf("读取到的数据为:%s\n",addr->text);
        memset(addr,0,256);
        sleep(1);
    }



}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <pthread.h>
#include <dirent.h>
#include <semaphore.h>
#include <signal.h>
#include <math.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <semaphore.h>

typedef struct shmbuf{
    char text[256];
}shm_t;
void semwait(int id_1,int index){
    struct sembuf buf = {0};
    buf.sem_num = index;
    buf.sem_op = -1;
    buf.sem_flg = SEM_UNDO;
    semop(id_1,&buf,1);
}

void sempost(int id_1,int index){
    struct sembuf buf = {0};
    buf.sem_num = index;
    buf.sem_op = 1;
    buf.sem_flg = SEM_UNDO;
    semop(id_1,&buf,1);
}
void* run(void* arg){
	key_t key2 = ftok("./ipc",2);//创建秘钥
    if(key2 == -1){
        perror("ftok");
        return NULL;
    }
	int id_2 = semget(key2,2,IPC_CREAT | 0666);
    if(id_2 == -1){
        perror("semget");
        return NULL;
    }
    semctl(id_2,1,SETVAL,0);

	int id = shmget(key2,256,IPC_CREAT | 0666);
	//根据秘钥创建共享内存id,参数有秘钥,创建的
	//共享内存字节大小,允许创建文件权限
    if(id == -1){
        perror("shmget");
        return NULL;
    }
    shm_t* addr = shmat(id,NULL,0);
    // 将共享内存映射到独立内存,参数有共享内存id,NULL
	// 表示随机分配独立内存,0表示内存可读可写
    
    int len = 0;
    while(1){
        printf("请输入数据:");
        scanf("%256s",addr->text);//直接从终端将数据输入到共享内存中去
        while(getchar()!=10);
		sempost(id_2,0);
		
    }





}
int main(int argc, const char *argv[])
{
	pthread_t id_a;
	pthread_create(&id_a,NULL,run,NULL);
	pthread_detach(id_a);

    key_t key = ftok("./ipc",1);//创建秘钥
    if(key == -1){
        perror("ftok");
        return 1;
    }
    // 创建1个信号等集,该集合中有2个信号量
    int id_1 = semget(key,2,IPC_CREAT | 0666);
    if(id_1 == -1){
        perror("semget");
        return 1;
    }
	// 第0个信号量初始化为0,第1个信号量初始化为1
    semctl(id_1,0,SETVAL,0);
    semctl(id_1,1,SETVAL,1);
	int id = shmget(key,256,IPC_CREAT | 0666);
	//创建共享内存id
    if(id == -1){
        perror("shmget");
        return 1;
    }
    shm_t* addr = shmat(id,NULL,0);
    // 映射独立内存
	int len = 0;
	while(1){
		semwait(id_1,0);	
        printf("读取到的数据为:%s\n",addr->text);
        memset(addr,0,256);
        sleep(1);
    }
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值