信号量API#include
#include
#include
int semget(key_t key, int nsems, int semflg);
int semctl(int semid, int semnum, int cmd, ...);
int semop(int semid, struct sembuf *sops, unsigned nsops);semgetint s...
分类:
系统相关 时间:
2015-02-19 16:20:27
阅读次数:
283
实践1:信号量实现进程互斥父子进程执行流程如下:父进程子进程PPO(print)X(print)sleepsleepO(print)X(print)VVsleepsleep从图中可以看出, O或X总是成对出现的, 要么两个O, 要么两个X;/**P,V原语实现父子进程互斥使用终端**/
// 程序代码
int main(int argc,char *argv[])
{
int semid...
分类:
系统相关 时间:
2015-02-19 16:20:24
阅读次数:
262
System V(“系统五”)系统上发明了三种IPC机制(消息队列、信号量和共享内存),通常称为System V IPC。
C语言是一门面向过程的语言,与OO语言不同,它没有做到数据和操作的封装。因此在编写C语言程序的时候暴露在你面前的是一大堆函数。由于缺少OO的那层抽象,增加了记忆时的复杂度,因此如果你对函数分不清的话,常常会使你在编程的时候焦头烂额。本文不会详实地介绍各个函数的参数、返回值等等这些细节,本文的目的是帮助你打通三种IPC之间关系的任督二脉,从而强化理解,减轻记忆难度。看了本文希望您也能引申...
分类:
其他好文 时间:
2015-02-19 16:19:23
阅读次数:
309
实践:实现一个先进先出的共享内存shmfifo 使用消息队列即可实现消息的先进先出(FIFO), 但是使用共享内存实现消息的先进先出则更加快速; 我们首先完成C语言版本的shmfifo(基于过程调用), 然后在此基础上实现C++版本的ShmFifo, 将1块共享内存与3个信号量(1个mutext信号量, 1个full信号量, 1个empty信号量)封装成一个类ShmFifo, 然后编写各...
分类:
系统相关 时间:
2015-02-19 16:19:13
阅读次数:
337
概述 共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据(如图)。 共享内存 VS. 其他IPC形式 用管道/消息队列传递数据 用共享内存传递数据 共享内存生成之后,传递数据并不需要再走Linux内核,共享内存允许两个或多个进程共享一个给定的...
分类:
系统相关 时间:
2015-02-19 15:09:59
阅读次数:
280
共享内存API#include
#include
int shmget(key_t key, size_t size, int shmflg);
void *shmat(int shmid, const void *shmaddr, int shmflg);
int shmdt(const void *shmaddr);
int shmctl(int shmid, int cmd, stru...
分类:
系统相关 时间:
2015-02-19 15:06:52
阅读次数:
228
消息队列综合案例消息队列实现回射客户/服务器 server进程接收时, 指定msgtyp为0, 从队首不断接收消息server进程发送时, 将mtype指定为接收到的client进程的pid client进程发送的时候, mtype指定为自己进程的pidclient进程接收时, 需要将msgtyp指定为自己进程的pid, 只接收消息类型为自己pid的消息;// client/server进程接收/...
分类:
系统相关 时间:
2015-02-18 19:56:29
阅读次数:
304
消息发送/接收APImsgsnd函数int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);参数 msgid: 由msgget函数返回的消息队列标识码, 也可以是通过ipcs命令查询出来的一个已经存在的消息队列的ID号 msgp:是一个指针,指针指向准备发送的消息, msgsz:是msgp指向的消息长度, 注意...
分类:
系统相关 时间:
2015-02-18 19:55:57
阅读次数:
268
1. 创建/获取一个消息队列#include /* For O_* constants */
#include /* For mode constants */
#include
mqd_t mq_open(const char *name, int oflag); //专用于打开一个消息队列
mqd_t mq_open(const char *name,...
分类:
系统相关 时间:
2015-02-18 19:55:53
阅读次数:
497
FIFO具名/命名管道 (匿名)管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。 如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道;命名管道是一种特殊类型的文件. 创建一个命名管道1)命名管道可以从命令行上创建: $ mkfifo 2)命名管道在程序里创建: #include
#include ...
分类:
系统相关 时间:
2015-02-18 18:52:05
阅读次数:
355