有名信号量和共享内存实现同步聊天

时间:2022-11-17 15:18:21

有名信号量和共享内存实现同步聊天

共享内存是最为高效的进程间通信方式,可直接读写内存,不需要任何数据的拷贝,因此效率高。

共享内存创建步骤:
1、创建或打开共享内存  shmget函数实现
2、映射共享内存        shmat函数实现
3、撤销共享内存映射    shmdt函数实现
4、删除共享内存对象    shmctl函数实现
有名信号量:可实现进程间通信的同步
sem_open函数打开或创建
sem_wait函数和sem_post函数来使用
sem_close函数用来关闭有名信号量
sem_unlink函数用来删除有名信号量


以下是两个进程直接实现简单的聊天:

进程1:
#include <stdio.h>#include <sys/ipc.h>#include <sys/shm.h>#include <sys/types.h>#include <string.h>#include <signal.h>#include <stdlib.h>#include <fcntl.h>#include <sys/stat.h>#include <semaphore.h>char *p;sem_t *sem1,*sem2;void fun(int sig){   shmdt(p);   sem_close(sem1);   sem_close(sem2);   sem_unlink("aaa");   sem_unlink("bbb");   exit(0);   return;}int main(){   sem1 = sem_open("aaa",O_CREAT,0666,1);   if(SEM_FAILED == sem1)   {      perror("sem_open error!");      return -1;   }   sem_t * sem2 = sem_open("bbb",O_CREAT,0666,0);   if(SEM_FAILED == sem2)   {      perror("sem_open error!");      return -1;   }   key_t key = ftok(".",1);   if(key < 0)   {      perror("ftok error!");      return -1;   }   int shmID = shmget(key,100,IPC_CREAT | 0666);   if(shmID < 0)   {      return -1;   }   p = shmat(shmID,NULL,0);   if(p == (char *)-1)   {      perror("shmat error!");      return -1;   }   *p = 0;   printf("*********小喵*********\n");   while(1)   {      sem_wait(sem1);      signal(SIGINT,fun);      if(*p != 0)      {         printf("收到:%s\n",p);      }      memset(p,0,100);      gets(p);      sem_post(sem2);   }}
进程2:
 
#include <stdio.h>#include <sys/ipc.h>#include <sys/shm.h>#include <sys/types.h>#include <signal.h>#include <string.h>#include <stdlib.h>#include <fcntl.h>#include <sys/stat.h>#include <semaphore.h>char *p;int shmID;sem_t *sem1,*sem2;void fun(int sig){      shmdt(p);   shmctl(shmID,IPC_RMID,NULL);   sem_close(sem1);   sem_close(sem2);   sem_unlink("aaa");   sem_unlink("bbb");   exit(0);   return;}int main(){   sem1 = sem_open("aaa",O_CREAT,0666,1);   if(SEM_FAILED == sem1)   {       perror("sem_open error!");       return -1;   }   sem2 = sem_open("bbb",O_CREAT,0666,0);   if(SEM_FAILED == sem2)   {       perror("sem_open error!");      return -1;   }   key_t key = ftok(".",1);   if(key < 0)   {      perror("ftok error!");      return -1;   }   shmID = shmget(key,100,IPC_CREAT | 0666);   if(shmID < 0)   {      return -1;   }   p = shmat(shmID,NULL,0);   if(p == (char *)-1)   {      perror("shmat error!");      return -1;   }   printf("*******小汪*********\n");   while(1)   {      sem_wait(sem2);      signal(SIGINT,fun);      printf("收到:%s\n",p);      memset(p,0,100);      gets(p);      sem_post(sem1);   }}

 
以上是实现简单的两个进程聊天,进程1先发出消息由进程2接收,当收到Ctrl+c信号后聊天结束并且删除有名信号量退出
感谢阅读!!!