信号量
定义信号变量;  sem_t sem1 sem2
初始化信号量
P操作
          V操作  
 功能
信号量(POSOX)
信号量灯(IPC)
定义信号变量
sem_t  sem1
semget
初始化信号量
sem_init
semctl
P操作
sem_wait
semop
V操作
sem_post
semop
 多 线程中的信号量例子:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <pthread.h>
#include <string.h>
#include <semaphore.h> #define N 64 sem_t sem; void * f(void *arg)
{
while (1)
{
sem_wait(&sem);
sleep(1);
printf("%s", (char *)arg);
}
} int main()
{
pthread_t thread;
char buf[N]; //= "you are welcome";
void *thread_result; if (sem_init(&sem, 0, 0) == -1)
{
perror("sem_init");
exit(-1);
} if (pthread_create(&thread, NULL, f, buf) != 0)
{
fprintf(stderr, "pthread_create %s\n", strerror(errno));
exit(-1);
} do
{
printf("input:");
fflush(stdout);
fgets(buf, N, stdin);
sem_post(&sem);//唤醒子线程 V操作
} while (strncmp(buf, "quit", 4)); return 0;
}

信号灯:
信号灯集合(可以包含多个信号量)  IPC对象是一个
信号灯集 (含有多个信号量)
所有的函数是对一个集合的操作:
int semget(key_t key, int nsems, int semflg);
所需头文件
#include <sys/types.h>

#include <sys/ipc.h>
#include <sys/sem.h>
函数原型
int semget(key_t key, int nsems, int semflg);
函数参数
key :和信号灯集关联的 key 
 
nsems:  信号灯集中包含的信号灯数目
 
semflg :信号灯集的访问权限
函数返回值
成功:信号灯集 ID
 
出错: -1
  
所需头文件
#include <sys/types.h>

#include <sys/ipc.h>
#include <sys/sem.h>
函数原型
int semop ( int semid, struct sembuf  *opsptr,  size_t  nops);
函数参数
semid :信号灯集 ID


struct sembuf {
   short  sem_num;  // 要操作的信号灯的编号
   short  sem_op;   //  0 :  等待,直到信号灯的值变成 0
                    // 1 :  释放资源, V 操作
                    //   -1 :  分配资源, P 操作                    
   short  sem_flg;     // 0,  IPC_NOWAIT,  SEM_UNDO
};
nops:  要操作的信号灯的个数

所需头文件
#include <sys/types.h>

#include <sys/ipc.h>
#include <sys/sem.h>
函数原型
int semctl ( int semid, int semnum,  int cmd   union semun arg(不是地址 ) );
函数参数
semid :信号灯集 ID


semnum: 要修改的信号灯编号
 
cmd 
GETVAL :获取信号灯的值

SETVAL :设置信号灯的值
IPC_RMID :从系统中删除信号灯集合
 
 
函数返回值
成功: 0
 
出错: -1
semctl:cmd                          GETVAL:获取信号灯的值
                                            SETVAL:设置信号灯的值
                                            IPC_RMID:从系统中删除信号灯的集合
msgctl:cmd                          IPC_STAT(获取对象属性)
shmctl:cmd                          IPC_SET(设置对象属性)
SETVAL:设置信号灯的值  信号灯的初始化,类似sem_init;
联合体:                         

union semun
   {
          int val;  
//SETVAL:设置信号灯的值
          struct semid_ds *buf;
// IPC_STAT  (获取对象属性)
//IPC_SET (设置对象属性)
     unsigned short  *array;  /* Array for GETALL, SETALL */
     struct seminfo  *__buf;  /* Buffer for IPC_INFO (Linux-specific) */

   };
server.c端
#include "stdio.h"
#include "sys/ipc.h"
#include "sys/sem.h"
#include "sys/types.h"
#include "stdlib.h"
/*联合体*/
union semun
{
int val; //SETVAL:设置信号灯的值
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
};
int main()
{
int i;
int key;
int semid;
union semun mysemun;
struct sembuf mysembuf;
key=ftok("./a.c",'a');//touch a.c记得每次要先创建a.c
if(key < 0)
return -1;
semid=semget(key,2,IPC_CREAT | 0777);// 创建信号灯集
if(semid < 0)
return -2;
mysemun.val=0;//初始化信号灯
semctl(semid,0,SETVAL,mysemun);//初始化信号灯集,也可以删除信号灯; /*先运行*/
for(i=0;i< 10 ;i++)
{
printf("this is first process\n");
sleep(1);
}
/*运行完以后进行唤醒 v操作*/
mysembuf.sem_num=0;
mysembuf.sem_op=1;//信号灯v操作
mysembuf.sem_flg=0;
semop(semid,&mysembuf,1);
return 0;
}

client.c端
#include "stdio.h"
#include "sys/ipc.h"
#include "sys/sem.h"
#include "sys/types.h"
#include "stdlib.h" union semun
{
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
};
int main()
{
int i;
int key;
int semid;
union semun mysemun;
struct sembuf mysembuf;
key=ftok("./a.c",'a');
if(key < 0)
return -1;
semid=semget(key,2,IPC_CREAT | 0777);
if(semid < 0)
return -2;
/*后运行不需要在初始化*/
//mysemun.val=0;
//semctl(semid,0,SETVAL,mysemun); //
mysembuf.sem_num=0;
mysembuf.sem_op=-1;//信号灯p操作
mysembuf.sem_flg=0;
semop(semid,&mysembuf,1);
for(i=0;i< 10 ;i++)
{
printf("this is second process\n");
sleep(1);
}
return 0;
}

笔记七:进程间的通信(IPC通信之信号灯)的更多相关文章

  1. 进程间的通讯(IPC)方式

    内存映射 为什么要进行进程间的通讯(IPC (Inter-process communication)) 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间共享数据 ...

  2. Android进阶笔记04:Android进程间通讯(IPC)之Messenger

    一. Android进程间通讯之Messenger 的引入 (1)引言:      平时一说进程间通讯,大家都会想到AIDL,其实messenger和AIDL作用一样,都可以进行进程间通讯.它是基于消 ...

  3. Android(java)学习笔记232:Android进程间通讯(IPC)之AIDL

    一.IPC inter process communication  进程间通讯 二.AIDL android  interface  defination  language  安卓接口定义语言 满 ...

  4. Android(java)学习笔记175:Android进程间通讯(IPC)之AIDL

    一.IPC inter process communication  进程间通讯 二.AIDL android  interface  defination  language  安卓接口定义语言 满 ...

  5. Windows进程间通讯(IPC)----WM_COPYDATA

    WM_COPYDATA通讯思路 通过向其他进程的窗口过程发送WM_COPYDATA消息可以实现进程间通讯. 只能通过SendMessage发送WM_COPYDATA消息,而不能通过PostMessag ...

  6. Windows进程间通讯(IPC)----内存映射文件

    内存映射文件原理 内存映射文件是通过在虚拟地址空间中预留一块区域,然后通过从磁盘中已存在的文件为其调度物理存储器,访问此虚拟内存空间就相当于访问此磁盘文件了. 内存映射文件实现过程 HANDLE hF ...

  7. Windows进程间通讯(IPC)----管道

    管道的分类 管道其实际就是一段共享内存,只不过Windows规定需要使用I/O的形式类访问这块共享内存,管道可以分为匿名管道和命名管道. 匿名管道就是没有名字的管道,其支持单向传输数据,如果需要双向传 ...

  8. 进程间的通讯————IPC

    """ IPC 指的是进程间通讯 之所以开启子进程 肯定需要它帮我们完成任务 很多情况下 需要将数据返回给父进程 然而 进程内存是物理隔离的 解决方案: 1.将共享数据放 ...

  9. UNIX 进程间通讯(IPC)概念(Posix,System V IPC)

     IPC(Inter-Process Communication,进程间通讯)可以有三种信息共享方式(随文件系统,随内核,随共享内存).(当然这里虽然说是进程间通讯,其实也是可以和线程相通的). 相对 ...

  10. Windows进程间通讯(IPC)----消息队列

    消息队列 windows系统是通过消息驱动的,每移动一下鼠标,点击一下屏幕都会产生一个消息.这些消息会先被放在windows的一个系统消息队列(先进先出)中,windows系统会为每一个GUI线程创建 ...

随机推荐

  1. LoadRunner性能测试-app压力测试

    步骤分为三步: 一,录制脚本 录制脚本原理:启动LR代理服务器监听设置好的端口号是否有请求发送给服务器,有请求时,代理服务器接收请求,并转发给对应的系统服务器,LR从而获取到请求的信息与数据,生成脚本 ...

  2. How to Install VMware Tools on CentOS 6.5

    yum install perl gcc make kernel-headers kernel-devel -y [root@centos6 vmware-tools-distrib]# ./vmwa ...

  3. .Netcore webApi 注入socket 与客户端交互

    模拟服务端 private string TcpServiceControl(string value) { // 1.按照模拟工具上看 先new一个tcp服务 Socket serverSocket ...

  4. 初次使用Sqoop报错,sqoop命令不能正常使用:hcatalog does not exist!accumulo does not exist!

    1.问题描述: (1)问题示例: [hadoop@master Tmp]$ sqoop  helpWarning: /home/grid/Sqoop/sqoop-1.4.7/../hcatalog d ...

  5. Undelivered Mail Returned to Sender

    电子邮件是使用电子邮件地址application@sample.com从Application发送的. 出于业务原因我们无法在此应用程序中更新/删除无效的外部电子邮件地址,因此响应出站电子邮件会生成许 ...

  6. LeetCode224 基本计算器

    idea:刚开始是打算分类讨论,建立了数字栈和字符栈,按照传入字符当时两个栈的基本情况分类,结果讨论完之后分类太麻烦,导致分析完了之后漏洞不少.我觉得这道题难点在于括号和负号的处理,一开始将导致计算机 ...

  7. Linux & 标准C语言学习 <DAY9_2>

    一.进程映像     程序:存储在磁盘上的可执行文件(二进制文件.脚本文件)     进程:正在系统中运行的程序     进程映像:进程的内存分布情况         text(代码段):       ...

  8. vuex相关笔记

    vuex是什么? vuex是管理应用程序状态,实现组件间通信的. 为什么使用vuex? 在开发大型应用的项目时,会出现多个视图组件依赖一个同一个状态,来自不同视图的行为需要变更同一个状态. 在遇到以上 ...

  9. 解密Prompt系列4. 升级Instruction Tuning:Flan/T0/InstructGPT/TKInstruct

    这一章我们聊聊指令微调,指令微调和前3章介绍的prompt有什么关系呢?哈哈只要你细品,你就会发现大家对prompt和instruction的定义存在些出入,部分认为instruction是promp ...

  10. [ACM]TL-Kruskal

    #include<iostream> #include<cstdio> using namespace std; struct edge { int u; int v; int ...