使用Linux高级IPCLinux内核与编程提纲结束?进程间通信概述?目标问题——哲学家进餐问题–问题描述–错误与不好的解法–并行度较高的解法?Linux高级IPC机制–概述–System V信号灯?实现的其他问题Linux内核与编程进程间通信概述(1)?进程是相互独立的,进程间的通信需要专门的机制。?进程之间的通信可以经由文件系统,但实际使用较为复杂(例如,需要锁机制)。?UNIX IPC (munication)机制是各种进程通信方式的统称。?Linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。Linux内核与编程进程间通信概述(2)?对于UNIX的发展,贝尔实验室和BSD在进程间通信方面的侧重点有所不同:–贝尔实验室对Unix早期的进程间通信手段进行了系统的改进和扩充,形成了“System V IPC”,通信进程局限在单个计算机内;–BSD则主要考虑跨计算机的进程间通信,形成了基于套接口(socket)的进程间通信机制。Linux内核与编程进程间通信概述(3)返回最初的UNIX IPCSystem V IPC基于Socket的IPCLinux IPCPOSIX IPC?最初的Unix IPC:信号、管道、FIFO;?System V IPC:消息队列、信号量、共享内存区;?POSIX IPC:消息队列、信号量、共享内存区。Linux内核与编程哲学家进餐问题的描述?五个哲学家围坐在一张圆桌周围,每个哲学家面前都有一碗米饭,相邻的两碗之间有一支筷子(如图)。?哲学家的生活包含两种活动:即吃饭和思考。当一个哲学家觉得饿时,他就试图分两次去取他左边和右边的筷子,每次拿起一支,但不分次序。如果成功地获得了一双筷子,他就开始吃饭,吃完以后放下筷子继续思考。这样,问题就是,为每个哲学家写一段程序来描述其行为,要求不死锁。返回Linux内核与编程?解法一:可能进入“死锁”状态#define N 5void philosopher(int i){while(TRUE){ take-chopstick(i); take-chopstick((i+1)%N); eat(); put-chopstick((i+1)%N); put-chopstick(i); think(); }}错误与不好的解法若每个哲学家进程都运行到此句后发生进程切换,则进入死锁。Linux内核与编程#define N 5void philosopher(int i){ for( 循环若干次) { if(基数号哲学家) { take-chopstick(i); take-chopstick((i+1)%N); eat(); put-chopstick ((i+1)%N); put-chopstick (i); think(); }else //偶数号哲学家{ take-chopstick( (i+1)%N); take-chopstick (i); eat(); put-chopstick (i); put-chopstick ((i+1)%N); think(); } }}并行度较高的解法Linux内核与编程概述?System V IPC包含了三种机制,在实现“哲学家进餐问题”时,我们只使用信号灯机制。主要的函数如下:信号灯头文件<sys/>创建或打开IPCsemget 控制IPC操作semctlIPC操作函数semop?System V IPC对象以key_t类型的值作为其名字。?System V IPC对象以一定的存取权限来控制其访问。返回Linux内核与编程System V IPC的名字?System V IPC是有名的,这样可以支持无亲缘关系的进程访问同一的IPC对象。其名字的类型为key_t,可以由ftok函数赋予或直接取值IPC_PRIVATE。?ftok函数–原型:#include <sys/>#include <sys/>key_tftok(const char * pathname, int id);–功能:把已存在的路径名和一整数标识符转换成一个key_t值,称为IPC键。–返回值:成功时返回IPC键,出错返回-1。–说明:1、ftok产生的键值不会是IPC_PRIVATE;2、不能保证ftok生成的
使用Linux信号量 来自淘豆网m.daumloan.com转载请标明出处.