信号量实现进程之间通信

一.信号量

信号量是一种数据操作锁,本身不具有数据交换功能,而是通过控制其他的通信资源来实现进程之间的通信,简单来讲,信号量相当于一个计数器,计数当前某种资源的个数。信号量的周期也是随内核的。为了解决多个程序同时访问一个共享资源引发的问题。

临界资源:多个进程能访问到的公共资源。

临界区:将能访问带临界资源的代码成为临界区。

同步:对临界资源的访问具有顺序性。

pv 操作

p(sv)  sv>0 减1  sv=0   挂起的该进程执行

s(sv)  没有进程因等待sv而挂起就加1,有进程等待sv被挂起,就恢复运行。

信号量用到的函数:

int semget(key_t key,int nsems,int smflag)//nsems:信号量个数

以信号量集为基本单位进行申请。

int semctl(int semid, int semnum, int cmd, ...);//semnum:第几个信号量

信号量实现进程间通信:

 //comm.h
  1 
  2 #pragma once
  3 #include<unistd.h>
  4 #include<stdlib.h>
  5 #include<stdio.h>
  6 #include<sys/types.h>
  7 #include<sys/sem.h>
  8 #include<sys/ipc.h>
  9 #define _PATH_ "."
 10 #define _PROJ_ID_ 0x7777
 11 
 12 union semun
 13 {
 14    int val;
 15    struct semid_ds *buf;
 16    unsigned short *array;
 17    struct seminfo *_buf;
 18 };
 19  static int comm(int __sem_nums,int flag);
 20 int create_sem_set(int _sem_nums);
 21 int get_sem_set(int _sem_nums);
 22 int init_sem_set(int _sem_id,int _sem_num,int _sem_val);
 23 int p_sem_elem(int _sem_id ,int _sem_num);
 24 int v_sem_elem(int _sem_id,int _sem_num);
 25 int destroy_sem(int _sem_id);
~ 

//comm.c

  1 #include"comm.h"
  2 static int comm(int _sem_nums,int flag)
  3 {
  4   key_t key=ftok(_PATH_,_PROJ_ID_);
  5   if(key<0)
  6   {
  7     perror("ftok");
  8     return -1;
  9   }
 10   int sem_id=semget(key,_sem_nums,flag);
 11   if(sem_id<0)
 12   {
 13     perror("semget");
 14     return -1;
 15   }
 16 
 17   return sem_id;
 18 
 19 }
 20  int create_sem_set(int _sem_nums)
 21 {
 22   int flag=IPC_CREAT|IPC_EXCL|0666;
 23   return comm(_sem_nums,flag);
 24 
 25 
 26 }
 27 int get_sem_set(int _sem_nums)
 28 {
 29    int flag=IPC_CREAT;
 30    return comm(_sem_nums,flag);
 31 }
 32 int init_sem_set(int _sem_id,int _sem_num,int _sem_val)
 33 {
 34    union semun _un;
 35    _un.val=_sem_val;
 36    if(semctl(_sem_id,_sem_num,SETVAL,_un)<0)
 37    {
 38     perror("semctl");
 39     return -1;
 40 
 41     }
 42    return 0;
 43   }
 44 int p_sem_elem(int _sem_id ,int _sem_num)
 45 {
 46    struct sembuf _sem_buf[1];
 47    _sem_buf[0].sem_num=_sem_num;
 48    _sem_buf[0].sem_op=-1;
 49    _sem_buf[0].sem_flg=0;
 50 if(semop(_sem_id,_sem_buf,1)<0)
 51   {
 52   perror("semop");
 53   return -1;
 54 
 55   }
 56   return 0;
 57 }
 58 int v_sem_elem(int _sem_id,int _sem_num)
 59 {
 60    struct sembuf _sem_buf[1];
 61    _sem_buf[0].sem_num=_sem_num;
 62    _sem_buf[0].sem_op=1;
 63    _sem_buf[0].sem_flg=0;
 64 if(semop(_sem_id,_sem_buf,1)<0)
 65   {
 66     perror("semop");
 67     return -1;
 68 
 69   }
 70   return 0;
 71 
      }
 74 int destroy_sem(int _sem_id)
 75 {
 76   if(semctl(_sem_id,0,IPC_RMID,NULL)<0)
 77   {
 78   perror("semctl");
 79    return -1;
 80 
 81 
 82   }
 83 return 0;
   }
   
   
 91 int main()
 92 {
 93   int sem_id=create_sem_set(1);
 94   init_sem_set(sem_id,0,1);
 95   pid_t pid=fork();
 96   if(pid<0)
 97   {
 98    perror("fork");
 99    exit(1);
100   }
101 
102   else if(pid==0)
103   {
104       int sem_id=get_sem_set(1);
105       while(1)
106       {
107         p_sem_elem(sem_id,0);
108         printf("A");
109         sleep(1);
110        fflush(stdout);
111        printf("A");
112        sleep(7);
113        fflush(stdout);
114        v_sem_elem(sem_id,0);                                                         116      }
117  }
118 
119   else
120   {
121      while(1)
122     {
123       p_sem_elem(sem_id,0);
124 
125       printf("B");
126       sleep(2);
127       fflush(stdout);
128       printf("B");
129       sleep(5);
130       fflush(stdout);
131       v_sem_elem(sem_id,0);
132 
133 
134     }
135  }                                                                                        return 0;
   }

程序运行结果:

时间: 2024-10-12 13:57:09

信号量实现进程之间通信的相关文章

IPC进程之间通信的几种方式

概念 进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是 共享内存区 .但是,系统空间却是“公共场所”,所以内核显然可以提供这样的条件. 除此以外,那就是双方都可以访问的 外设 了.在这个意义上,两个进程当然也可以通过磁盘上的普通文件交换信息,或者通过“注册表”或其它数据库中的某些表项和记录交换信息.广义上这也是进程间通信的手段,但是一般都不把这算作“进程间通信”.因为那些通信手段的效率

进程与进程之间通信Manager

1 #!/usr/bin/env python 2 from multiprocessing import Process,Manager 3 4 #Manager进程与进程之间通信 5 def Foo(i,dic): 6 dic[i] = 100+i 7 print(dic.values()) 8 if __name__ == '__main__': 9 manage = Manager() 10 dic = manage.dict() 11 for i in range(2): 12 p =

进程之间通信之有名管道、无名管道(pipe),笔记

             进程之间的通信作用1.数据传输   :一个进程需要将他的数据传到其他进程2.资源共享3.进程通知事件4.进程控制 :有些进程完全控制另一个进程的执行,如调试状态啊我们需要完全控制他的每一步操作: 通信发展历史Linux进程间的通信IPC由以下几个部分发展而来:1.UNIX进程之间的通信2.基于system v进程间的通信3.POSIX进程之间的通信(portable operating system interface) 现在Linux使用的进程间的通信方式包括:1.管

linux程序设计——pipe调用在两进程之间通信(第十三章)

13.4    pipe调用 在看过高级的popen函数之后,再来看看底层的pipe函数.通过这个函数在两个程序之间传递数据不需要启动一个shell来解释请求的命令.它同时提供了对读写数据的更多控制. pipe函数的原型如下所示: #include <unistd.h> int pipe(int file_descriptor[2]); 参数:是一个由两个整数类型的文件描述符组成的数组. 返回值:该函数在数组中填上两个新的文件描述符,如果成功则返回0,如果失败则返回-1并设置errno来表明失

使用命名管道进程之间通信(转)

原文地址:http://www.cnblogs.com/yukaizhao/archive/2011/08/04/system-io-pipes.html 命名管道: 命名管道的功能比匿名管道更强大,可以在进程之间做双工通信(即通信的两个进程都是既可以读也可写的):命名管道也可以实现跨网络在不同机器之间进行通信.可以在多线程中创建多个NamedPipeServerStream实例,为多个client端服务.另外命名管道还支持消息传输,这样client端可以读取任意长度的消息,而无须知道消息的长度

进程之间通信

IPC 指的是进程间通讯 之所以开启子进程 ,肯定需要他帮我们完成任务,很多情况下,需要将数据返回给父进程. 然而进程内存是物理隔离的 解决方案: 1.将共享数据放在文件中,就是慢 2.管道 subprocess 中那个管道只能单向通讯,必须有父子关系 3.共享一块内存区域 得操作系统帮你分配,速度快 第三钟实现Manager from multiprocessing import Process,Manager import time def task(dic): print("子进程&quo

跨进程(同一app不同进程之间通信)——Android自动化测试学习历程

视频地址:http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=877122&courseId=712011 一.问题: 1.如何做到一个app不同进程通信? 2.多个app通信(不同app) 3.注入事件运行脚本和调用隐藏api 二.一个app不同进程通信: 知识点: 1.Intent.binder 2.Service.Activity 3.Handler.view 4.Messeng

c# IPC实现本机进程之间的通信

IPC可以实现本地进程之间通信.这种用法不是太常见,常见的替代方案是使用wcf,remoting,web service,socket(tcp/pipe/...)等其他分布式部署方案来替代进程之间的通信.虽然不常见但也避免不了一些场景会使用该方案. 应用包含: 1)使用IPC技术实现多client与一个sever通信(不过是本机,感觉意义不大,但如果想实现本机上运行确实是一个不错的方案): 2)使用IPC技术实现订阅者和生产者分离时,一个server接收并消费消息,客户端是生产消息的. 1 1:

11.python并发入门(part10 多进程之间实现通信,以及进程之间的数据共享)

一.进程队列. 多个进程去操作一个队列中的数据,外观上看起来一个进程队列,只是一个队列而已,单实际上,你开了多少个进程,这些进程一旦去使用这个队列,那么这个队列就会被复制多少份. (队列=管道+锁) 这么做的主要原因就是,不同进程之间的数据是无法共享的. 下面是使用进程队列使多进程之间互相通信的示例: 下面这个例子,就是往进程队列里面put内容. #!/usr/local/bin/python2.7 # -*- coding:utf-8 -*- import multiprocessing de