笔记七:进程间的通信(IPC通信之信号灯)
|
功能
|
信号量(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;
}信号灯集 (含有多个信号量)
|
所需头文件
|
#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
|
|
#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;
}#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通信之信号灯)的更多相关文章
- 进程间的通讯(IPC)方式
内存映射 为什么要进行进程间的通讯(IPC (Inter-process communication)) 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间共享数据 ...
- Android进阶笔记04:Android进程间通讯(IPC)之Messenger
一. Android进程间通讯之Messenger 的引入 (1)引言: 平时一说进程间通讯,大家都会想到AIDL,其实messenger和AIDL作用一样,都可以进行进程间通讯.它是基于消 ...
- Android(java)学习笔记232:Android进程间通讯(IPC)之AIDL
一.IPC inter process communication 进程间通讯 二.AIDL android interface defination language 安卓接口定义语言 满 ...
- Android(java)学习笔记175:Android进程间通讯(IPC)之AIDL
一.IPC inter process communication 进程间通讯 二.AIDL android interface defination language 安卓接口定义语言 满 ...
- Windows进程间通讯(IPC)----WM_COPYDATA
WM_COPYDATA通讯思路 通过向其他进程的窗口过程发送WM_COPYDATA消息可以实现进程间通讯. 只能通过SendMessage发送WM_COPYDATA消息,而不能通过PostMessag ...
- Windows进程间通讯(IPC)----内存映射文件
内存映射文件原理 内存映射文件是通过在虚拟地址空间中预留一块区域,然后通过从磁盘中已存在的文件为其调度物理存储器,访问此虚拟内存空间就相当于访问此磁盘文件了. 内存映射文件实现过程 HANDLE hF ...
- Windows进程间通讯(IPC)----管道
管道的分类 管道其实际就是一段共享内存,只不过Windows规定需要使用I/O的形式类访问这块共享内存,管道可以分为匿名管道和命名管道. 匿名管道就是没有名字的管道,其支持单向传输数据,如果需要双向传 ...
- 进程间的通讯————IPC
""" IPC 指的是进程间通讯 之所以开启子进程 肯定需要它帮我们完成任务 很多情况下 需要将数据返回给父进程 然而 进程内存是物理隔离的 解决方案: 1.将共享数据放 ...
- UNIX 进程间通讯(IPC)概念(Posix,System V IPC)
IPC(Inter-Process Communication,进程间通讯)可以有三种信息共享方式(随文件系统,随内核,随共享内存).(当然这里虽然说是进程间通讯,其实也是可以和线程相通的). 相对 ...
- Windows进程间通讯(IPC)----消息队列
消息队列 windows系统是通过消息驱动的,每移动一下鼠标,点击一下屏幕都会产生一个消息.这些消息会先被放在windows的一个系统消息队列(先进先出)中,windows系统会为每一个GUI线程创建 ...
随机推荐
- 10、jmeter的 Http的请求默认值
在我们测试过程当中,有很多HTTP协议的请求 这些请求 有很多比如说网址(url)都是相同的 端口也是相同的,路径可能也是相同的 这个时候就需要用到请求默认值,后续直接用就可以 不需要再去配置 后续 ...
- Rfost的自我介绍+软工五问
自我介绍+软工五问 问题 解答 这个作业属于哪个课程 网工1934-软件工程 这个作业要求在哪里 作业要求 这个作业的目标 让学生对软件工程有个初步的了解,同时掌握基础的markdown语法和博客园的 ...
- C# DevExpress gridview 字符串尾部带数字如何排序
我们经常遇到这样的问题,字符串尾部带数字,如何正确排序; 首先设置GridView ,Columns 的相关列,设置属性中,SortMode为Custom 解决思路,把字符串尾缀数字,分离出来.先比较 ...
- 关于 ubuntu 22 desktop 安装 网易云音乐无法启动解决办法
- 报错现象 /opt/netease/netease-cloud-music/netease-cloud-music: /opt/netease/netease-cloud-music/libs/l ...
- linux命令基本操作
chmod 命令 : chmod -R 755 tools_command/ 解释 : -R 为递归遍历tools_command文件夹, chmod 755修改权限: 查看所有用户 1.cat /e ...
- v-imgerror作用:当图片链接无效的时候,显示默认图片内容
// 回顾自定义指令 // 作用: 自定义一些对DOM的操作快捷指令 // 前提: 指令就是用来操作DOM (v-if/v-show/v-for....) // 语法: Vue.directive(指 ...
- PCB封装设计建议:
1,通孔型元器件建议孔直径比元器件管脚直径大0.2-0.3mm左右,焊盘铜皮外沿一般是0.3-1mm(相当于直径应该加0.6-2mm)宽大元件可再大一点,对于设计单面板的,则最小铜皮外沿应大于1mm以 ...
- jvm垃圾收集器汇总
1.吞吐量和延时 吞吐量:吞吐量指的是cpu的利用时间,计算公式是 运行用户代码时间 / (用户代码时间 + 垃圾收集时间),吞吐量越大说明cpu的利用率越大. 延时:延时指的是停顿时间,用户代码不 ...
- VMware虚拟机迁移至Xen
1.VMware虚拟机导出OVF文件. 2.从Citrix Xencenter导入OVf文件 3.导入时,检查Local storage disk 下disk是否正确,如果曾导入失败,重复导入会产生多 ...
- 如何规避MyBatis使用过程中带来的全表更新风险
作者:京东零售 贾玉西 一.前言 程序员A: MyBatis用过吧? 程序员B: 用过 程序员A: 好巧,我也用过,那你遇到过什么风险没?比如全表数据被更新或者删除了. 程序员B: 咔,还没遇到过,这 ...