POSIX信号量加共享内存实现两个进程简单通信(一收一发)

要点

  • 用了POSIX具名信号量,可以在进程间共享
  • 用共享内存当做通信介质
  • 信号量初始值为0,实现同步的功能,需要发送端写入信息后通知接收方接收。
  • 其他细节在代码注释中
  • POSIXSem_w.cpp为发送端代码,POSIXSem_r.cpp为接收端代码。

代码

  • POSIXSem_w.cpp

    // 一个配合共享内存实现进程间同步的Posix信号量demo
    #define SHM_KEY 1111
    #define SEM_NAME "/TestSem"
    
    
    #include <unistd.h>
    #include <sys/shm.h>
    #include <semaphore.h>
    #include <stdio.h>
    #include <fcntl.h>
    
    
    int main(){
      // 打开一段共享内存。
      int shm_id = shmget(SHM_KEY, sizeof(int), 0666 | IPC_CREAT);
      // 判断是否打开成功
      if( shm_id < 0){
    	printf("fail to create share memory.\n");
    	return -1;
      }
      // 连接共享内存到进程空间,注意第二个参数一般为NULL
      void* shmptr = shmat(shm_id, NULL, 0);
      // 判断是否创建成功
      if(shmptr == (void*)-1){
    	printf("fail to link the share memory.\n");
    	return -1;
      }
      // 打开一个命名信号量
      // 因为做的是同步,所以初始信号量的值为0,写入数据后POST一下
      sem_t* sem_id = sem_open(SEM_NAME, O_CREAT, S_IRWXU, 0);
      int* data = static_cast<int*>(shmptr);
      while(1){
    	// 从标准输入读入数据
    	scanf("%d", data);
    
    	// 通知读端取走,这里其实有一个同步的问题,如果输入很快的话,还来不及读取,但是因为会等待在标准输入,所以没问题
    	sem_post(sem_id);
    	// 输入-1退出进程
    	if(*data == -1){
    	  break;
    	}
      }
      return 0;
    }
    
  • 接收端代码

    // 一个配合共享内存实现进程间同步的Posix信号量demo
    #define SHM_KEY 1111
    #define SEM_NAME "/TestSem"
    
    #include <unistd.h>
    #include <sys/shm.h>
    #include <semaphore.h>
    #include <stdio.h>
    #include <fcntl.h>
    
    int main(){
      // 打开一段共享内存。
      int shm_id = shmget(SHM_KEY, sizeof(int), 0666 | IPC_CREAT);
      // 判断是否打开成功
      if( shm_id < 0){
    	printf("fail to create share memory.\n");
    	return -1;
      }
      // 连接共享内存到进程空间,注意第二个参数一般为NULL
      void* shmptr = shmat(shm_id, NULL, 0);
      // 判断是否创建成功
      if(shmptr == (void*)-1){
    	printf("fail to link the share memory.\n");
    	return -1;
      }
      // 打开一个命名信号量
      // 因为做的是同步,所以初始信号量的值为0,写入数据后POST一下
      sem_t* sem_id = sem_open(SEM_NAME, O_CREAT, S_IRWXU, 0);
      int* data = static_cast<int*>(shmptr);
      while(1){
    	// 等待信号量通知
    	sem_wait(sem_id);
    	// 从标准输入读入数据
    	printf("%d\n", *data);
    	// 通知读端取走,这里其实有一个同步的问题,如果输入很快的话,还来不及读取,但是因为会等待在标准输入,所以没问题
    	// 输入-1退出进程
    	if(*data == -1){
    	  break;
    	}
      }
      return 0;
    }
    

版权声明:本文为xiashanrenlaozhang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/xiashanrenlaozhang/article/details/87954195