没有合适的资源?快使用搜索试试~ 我知道了~
首页Linux程序员必读:进程间通信与内核编程详解
"《Linux程序员指南》是一本深入探讨Linux系统编程的专业书籍,涵盖了多个关键领域,旨在帮助程序员更好地理解和利用Linux环境。该书首先回顾了Linux的历史,自1991年Linus Torvalds创建的第一个Linux版本以来,Linux以其开源特性赢得了全球程序员的支持,被移植到各种平台。 第二章聚焦于Linux内核,它是Linux的灵魂,包括设备驱动程序、进程管理和通信管理等核心组件。内核的编程遵循POSIX规范,虽然这使得编程规则有时复杂,但也是其灵活性和标准化的体现。书中推荐《Linux Kernel Hacker's Guide》作为进一步学习内核编程的参考资料。 第三章详细介绍了Linux libc包,这是Linux系统中的一个重要组成部分,它包含了如YP函数、加密函数、基本的系统调用和字符处理等功能。libc提供了多种语言错误信息,如英文、法文和德文,同时也考虑了BSD和bsd4.4lite的兼容性,以确保跨平台的稳定性和互操作性。此外,还包括屏幕处理、数据库管理、数学运算和图形处理等功能的库。 《Linux程序员指南》不仅阐述了Linux操作系统的基础,还深入剖析了内核编程和库的使用,是Linux开发者不可或缺的参考书籍,对于理解和优化Linux应用程序的性能,提升编程技巧具有极高的价值。无论是初次接触Linux的程序员,还是经验丰富的技术专家,都能从中获得宝贵的知识和实践经验。"
资源详情
资源推荐
• 使用半双工管道互相连接的任意进程必须位于一个相关的进程家族里。因为管道必须受
到内核的限制,所以如果进程没有在管道创建者的家族里面,则该进程将无法访问管道。
这一点是与命名管道( F I F O )有区别的。
6.3 命名管道
6.3.1 基本概念
命名管道的工作方式与普通的管道非常相似,但也有一些明显的区别。
• 在文件系统中命名管道是以设备特殊文件的形式存在的。
• 不同家族的进程可以通过命名管道共享数据。
• 因为所有的I / O 工作都是由共享进程处理的,文件系统中保留命名管道是为了将来使用。
6.3.2 创建FIFO
有许多种方法可以创建命名管道。其中前两者可以直接用 s h e l l来完成。
上面这两个命令执行同样的操作,只有一个地方存在差异。 m k i n f o命令提供了一个挂钩,
可以在创建 F I F O 文件之后直接改变它的许可。而如果用户使用 m k n o d ,则需要立刻调用
c h m o d命令。
在物理文件系统中,用户可以很快找到 F I F O 文件,因为在长目录列表中, F I F O 文件有一
个“p”指示符。
同时读者还可以注意到,在文件名的后面有一条竖线 (“管道符号”)。由此不难体会到运
行L i n u x 无所不在的好处。
为了用C语言创建F I F O ,用户可以使用mknod ( )系统调用:
关于mknod ( )更详细的介绍,用户可以参考 m a n的帮助信息,现在请看用 C语言创建F I F O
的一个简单的例子:
在上面这个例子中,文件 / t m p / M Y F I F O 是当作一个F I F O 文件而创建的。所申请的访问许
234 第三部分 Linux程序员指南
下载
可权限是“0 6 6 6 ”,尽管该权限会受到如下定义的掩码的影响:
一个常见的技巧是使用umask ( )系统调用暂时屏蔽掉掩码的值:
此外,mknod ( )的第三个参数可以忽略,除非用户创建的是设备文件,在那种情况下,
mknod ( )应该指明设备文件的主编号和从编号。
6.3.3 FIFO操作
对F I F O来说,I / O 操作与普通的管道 I / O 操作基本上是一样的,但也存在着一个主要的区
别。在F I F O 中,必须使用一个“o p e n”系统调用或者库函数来物理地建立联接到管道的通道。
而对于半双工管道而言,这是不必要的,因为管道是驻留在内核中的,而不是驻留在物理文
件系统上的。在下面的例子中,我们将把管道当作一个流来看待,使用 fopen ( )来打开它,并
使用fclose ( )来关闭它。
请看下面这个简单的服务器进程:
第6章 Linux进程间通信 235
下载
因为F I F O是默认阻塞的,所以在编译了这个服务器进程之后,可以在后台运行它:
我们稍后就将讨论F I F O的阻塞动作。首先,请看上面这个服务器进程的简单的客户前端,
如下所示:
6.3.4 FIFO上的阻塞动作
一般来说F I F O总是处于阻塞状态。换句话说,如果 F I F O是为了读操作而打开的,则进程
将“阻塞”,直到某些其他进程打开该 F I F O并且写数据。这个阻塞动作反过来也是成立的。如
果用户不希望发生阻塞,可以在 open ( )调用中使用O _ N O N B L O C K 标志,以关闭默认的阻塞
动作。
在上面那个简单的服务器进程的例子中,我们只是把它放在后台,让它在那里进行它的
236 第三部分 Linux程序员指南
下载
阻塞动作。用户还可以选择跳转到另一个虚拟控制台,并运行客户前端,来回切换以查看所
导致的动作。
6.3.5 SIGPIPE信号
最后需要注意的一点是,管道必须有人读并有人写。如果某个进程企图往管道中写数据,
而没有进程去读该管道,则内核将向该进程发送 S I G P I P E 信号。当在管道操作中涉及到两个以
上的进程时,这个信号是非常必要的。
6.4 系统V IPC
6.4.1 基本概念
在U n i x系统V中,AT & T引入了三种新的I P C方法(消息队列、信号量和共享内存 )。P O S I X
委员会还没有完全制定好这些工具的标准,但大多数实现已经支持这三种 I P C 方法。此外,
Berkeley (BSD)使用套接字来作为其 I P C 的主要方法,而不是采用系统 V的方法。L i n u x 可以同
时使用这两种I P C 方法( B S D和系统V ) 。在稍后的某章中将会介绍套接字。
在L i n u x中,系统V IPC的实现是由Krishna Balasubramanian完成的,他的电子邮箱地址是
b a l a s u b @ c i s . o h i o _ s t a t e . e d u。
1. IPC标识符
每一个I P C对象都有一个独一无二的 I P C 标识符与之联系。这里所说的“ I P C 对象”是指单
个的消息队列、信号量集合或者共享内存段。在内核中这个标识符可以用于唯一地标识一个
I P C 对象。例如,为了访问某个特定的共享内存段,用户唯一需要的是赋给那个内存段的独一
无二的I D 值。
标识符的唯一性是与对象的类型相关的。为了说明这一点,假设有一个数字标识符
“1 2 3 4 5”。当然不可能会有两个消息队列都对应到这个标识符。但还是存在一种明显的可能性,
即某个消息队列和某个共享内存段都具有这个数字标识符。
2. IPC关键字
为了获得一个唯一的 I D 号。必须使用关键字,客户进程和服务器进程双方都必须同意这
个关键字,这是构造应用程序的客户 /服务器框架的第一步。
当你给某人打电话时,你必须知道他的电话号码。此外,电话公司必须知道如何把你发
出的呼叫转达到它最终的目的地。一旦对方提起电话,开始作出响应,联接就建立起来了。
在系统V IPC方法中,“电话”直接对应到使用的对象的类型,而“电话公司”,或者说寻
找路由的方法,则与I P C 关键字有着直接的联系。
关键字对不同的对象可以具有相同的值,它是通过把关键字的值硬编码进应用程序来实
现的。这样做有一个缺点,就是关键字可能早已经在使用了。用户通常可以使用 ftok ( )函数
来为客户进程和服务器进程生成关键字的值。
第6章 Linux进程间通信 237
下载
ftok ( )返回的关键字值是这样生成的:把索引节点号、第一个变元中文件的次设备编号,
以及第二个变元中的工程标识符 (一个字符)组合起来,这就是返回值。这样的返回值不能保证
是唯一的,但应用程序可以查找到是否存在冲突,如果有的话则重新试着生成关键字。
在上面这个短的代码片段中,目录 / t m p / m y a p p 与’a’这个标识符组合在一起。另一个通
用的例子是使用当前目录:
采取什么样的关键字生成算法完全是由应用程序编程人员决定的。只要可以防止竞争条
件、死锁等等,无论采取什么方法都可以。为了方便进行介绍,这里将使用 ftok ( )方法。如
果用户能确定每个客户进程都是从独一无二的“ h o m e ”目录运行的,则所产生的关键字应该
能够满足需要。
无论关键字的值是如何产生的,它将用于后续的 I P C 系统调用中,用来创建 I P C 对象或者
获取对它的访问权限。
3. ipcs命令
i p c s命令可以用来获取所有系统 V IPC对象的状态。这个工具的 L i n u x 版本也是由K r i s h n a
B a l a s u b r a m a n i a n 编写的。
在默认的情况下,所有三种类型的 I P C对象都将显示出来。请看下面这个 i p c s 命令的输出
示例:
从上面这个输出中读者可以找到一个具有标识符“ 0”的消息队列,它是由 r o o t用户所拥
有的,具有八进制形式的访问权限 6 6 0 ,即- r w - r w - -。在此队列中有一条消息,而那个消息它
的大小总共为5个字节。
i p c s命令是一个功能非常强大的工具,它使用户可以研究内核中 I P C 对象的存储机制。读
者应该学好它,用好它。
4. ipcrm命令
i p c r m命令可以用来从内核删除一个 I P C 对象。I P C对象可以通过在用户代码中调用系统调
用来删除(稍后将介绍这方面的内容 )。然而,用户常常会需要手工删除 I P C对象,尤其是在开
发环境下,i p c r m命令的用法非常简单:
238 第三部分 Linux程序员指南
下载
剩余100页未读,继续阅读
职白
- 粉丝: 1
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- zlib-1.2.12压缩包解析与技术要点
- 微信小程序滑动选项卡源码模版发布
- Unity虚拟人物唇同步插件Oculus Lipsync介绍
- Nginx 1.18.0版本WinSW自动安装与管理指南
- Java Swing和JDBC实现的ATM系统源码解析
- 掌握Spark Streaming与Maven集成的分布式大数据处理
- 深入学习推荐系统:教程、案例与项目实践
- Web开发者必备的取色工具软件介绍
- C语言实现李春葆数据结构实验程序
- 超市管理系统开发:asp+SQL Server 2005实战
- Redis伪集群搭建教程与实践
- 掌握网络活动细节:Wireshark v3.6.3网络嗅探工具详解
- 全面掌握美赛:建模、分析与编程实现教程
- Java图书馆系统完整项目源码及SQL文件解析
- PCtoLCD2002软件:高效图片和字符取模转换
- Java开发的体育赛事在线购票系统源码分析
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功