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;
}