《unix环境高级编程》通读学习笔记(五)(第13、14章)
上一篇 / 下一篇 2007-08-04 18:06:11 / 个人分类:unix环境高级编程的学习记录
第13章精灵进程
13.1引言
精灵进程(daemon)是生存期长的一种进程。它们常常在系统引导装入时起动,在系统关闭时终止。因为它们没有控制终端,所以说它们是在后台运行的。UNIX系统有很多精灵进程,它们执行日常事物活动。51Testing软件测试网5k7SN*d@&x q1@
13.2精灵进程的特征
所有精灵进程都以超级用户(用户ID为0)的优先权运行。没有一个精灵进程具有控制终端—终端名称设置为问号(?)、终端前台进程组ID设置为-1。缺少控制终端可能是精灵进程调用了setsid的结果。除update以外的所有精灵进程都是进程组的首进程,对话期的首进程,而且是这些进程组和对话期中的唯一进程。update是它所在进程组(37)和对话期(37)中的唯一进程,但是该进程组的首进程(可能也是该对话期的首进程)已经终止。最后,应当引起注意的是所有这些精灵进程的父进程都是init进程。51Testing软件测试网J7Z7H L-C
13.3编程规则
在编写精灵进程程序时需遵循一些基本规则,以便防止产生并不希望的交互作用。
{{9p?0aA;}#wY0(1)首先做的是调用fork,然后使父进程exit。
*c/g9[Oz C \E0(2)调用setsid以创建一个新对话期。51Testing软件测试网)]0yy hl/H4k]
(3)将当前工作目录更改为根目录。51Testing软件测试网!D/H:R0h{ R6aT6R
(4)将文件方式创建屏蔽字设置为0。51Testing软件测试网7D+`k&c\fBu-j
(5)关闭不再需要的文件描述符。51Testing软件测试网Z}H8r}l;kpq)z:\.H2q8c
13.4出错记录
与精灵进程有关的一个问题是如何处理出错消息。因为它没有控制终端,所以不能只是写到标准出错输出上。需要有一个集中的精灵进程出错记录设施。
D5I4`}a j013.4.1 SVR4流log驱动程序
i;W1iQ0g C0SVR4提供了一种流设备驱动程序,其界面具有流出错记录,流事件跟踪以及控制台记录功能。图13-1详细给出了这种设施的整个结构。51Testing软件测试网 Zf.kf'FG?
有三个记录进程(logger):出错记录进程、跟踪记录进程以及控制台记录进程。每一条记录消息可以送给其中之一。
_q3ou7E(C4zH.I013.4.2 4.3+BSD syslog设施51Testing软件测试网 ?$D7|:|9]o
自4.2BSD以来,广泛地应用了BSD syslog设施。大多数精灵进程使用这一设施。图13-2显示了syslog设施的详细组织结构。
"p-l*H'G1MN013.5客户机-服务器模型
精灵进程常常用作为服务器进程。确实,图13-2中,可以称syslogd进程为服务器,用户进程(客户机)用UNIX域数据报套接口向其发送消息。
lL6L9rE3N5w0一般而言,服务器是一个进程,它等待客户机与其联系,提出某种类型的服务要求。图13-2中,由syslogd服务器提供的服务是记录出错消息。
:l+Ab$V(v`0第14章进程间通信
14.1引言
第8章说明了进程控制原语并且观察了如何调用多个进程。但是这些进程之间交换信息的唯一方法是经由fork或exec传送打开文件,或通过文件系统。本章将说明进程之间相互通信的其他技术—IPC(InterProcess Communication)。51Testing软件测试网{i/R|nX_;Sg*jZ0g
UNIX IPC已经是而且继续是各种进程通信方式的统称,其中极少能在所有UNIX的实现中进行移植。表14-1列出了不同实现所支持的不同形式的IPC。51Testing软件测试网v@eru,F
本章将讨论经典的IPC;管道、FIFO、消息队列、信号量以及共享存储器。51Testing软件测试网qc@J/v.c
14.2管道
管道是UNIX IPC的最老形式,并且所有UNIX系统都提供此种通信机制,管道有两种限制;
7Rk"_@;zbM0(1)它们是半双工的。数据只能在一个方向上流动。
1vj_$Vu?0(2)它们只能在具有公共祖先的进程之间使用。通常,一个管道由一个进程创建,然后该进程调用fork,此后父、子进程之间就可应用该管道。51Testing软件测试网!|a-n2kCo
管道是由调用pipe函数而创建的。
JML:Or6W8]0——————————————————————————————————————51Testing软件测试网$fT*H-d'N3Qo-Xj
#include <unistd.h>51Testing软件测试网{0}o t!YX3TZz(p
int pipe(intfiledes[2]) ;
4Uz.Jf"{ c0返回:若成功则为0,若出错则为-1
7E'My$OT NG P\0有两种方法来描绘一个管道,见图14-1。左半图显示了管道的两端在一个进程中相互连接,右半图则说明数据通过内核在管道中流动。51Testing软件测试网 fc A e.D
单个进程中的管道几乎没有任何用处。通常,调用pipe的进程接着调用fork,这样就创建了从父进程到子进程或反之的IPC通道。图14-2显示了这种情况。
Y5i-waW\0fork之后做什么取决于我们想要有的数据流的方向。对于从父进程到子进程的管道,父进程关闭管道的读端(fd[0]),子进程则关闭写端(fd[1])。图14-3显示了描述符的最后安排。51Testing软件测试网RUnr~4@7Z9rO
14.3 popen和pclose函数
因为常见的操作是创建一个连接到另一个进程的管道,然后读其输出或向其发送输入,所以标准I/O库为实现这些操作提供了两个函数popen和pclose。这两个函数实现的操作是:创建一个管道,fork一个子进程,关闭管道的不使用端,exec一个shell以执行命令,等待命令终止。
"C`Z_T(k#xsum0____________________________________________________________________________51Testing软件测试网u+A6R'C.I
#include <stdio.h>51Testing软件测试网n gh fetn
FILE *popen(const *charcmdstring, const char *type);
hKJn3u!vJ I0返回:若成功则为文件指针,若出错则为NULL
.E7I$m*P$Z0int pclose(FILE *fp);51Testing软件测试网;w"o6U)|I
返回:cmdstring的终止状态,若出错则为-151Testing软件测试网~^jB#By3S5V j"E
14.4协同进程
UNIX过滤程序从标准输入读取数据,对其进行适当处理后写到标准输出。几个过滤进程通常在shell管道命令中线性地连接。当同一个程序产生某个过滤程序的输入,同时又读取该过滤程序的输出时,则该过滤程序就成为协同进程(coprocess)。51Testing软件测试网}F opn'ia:}:g
协同进程的工作方式在C程序中也是非常有用的.51Testing软件测试网U6MKBT
14.5 FIFO
FIFO有时被称为命名管道。管道只能由相关进程使用,它们共同的祖先进程创建了管道。但是,通过FIFO,不相关的进程也能交换数据。51Testing软件测试网me@$f([zuJ
第14章已经提及FIFO是一种文件类型。创建FIFO类似于创建文件。确实,FIFO的路径名存在于文件系统中。51Testing软件测试网-J&s8YpxUD'z
----------------------------------------------------------------------------------------------------------------------
9q!V)ZNd C0#include <sys/types.h>
0B&h~ Q_$L!B^0#include <sys/stat.h>51Testing软件测试网)?a8gOD Y7j
int mkfifo(const *charpathname, mode_tmode);51Testing软件测试网,KBJ[\[d
返回:若成功则为0,若出错则为-151Testing软件测试网@%?k-Os/F@b
一旦已经用mkfifo创建了一个FIFO,就可用open打开它。确实,一般的文件I/O函数(close、read、write、unlink等)都可用于FIFO。51Testing软件测试网h(F3^an(I-g z
FIFO有两种用途:51Testing软件测试网+S$}8P;ey5@{v
(1) FIFO由shell命令使用以便将数据从一条管道线传送到另一条,为此无需创建中间临时文件。51Testing软件测试网tGE\]
(2) FIFO用于客户机-服务器应用程序中,以在客户机和服务器之间传递数据。51Testing软件测试网#n:R]9jtij/w)G
14.6系统V IPC
三种系统V IPC:消息队列、信号量以及共享存储器之间有很多相似之处。51Testing软件测试网gr/Vtw#i
14.6.1标识符和关键字
C5_2a(w g h0每个内核中的IPC结构(消息队列、信号量或共享存储段)都用一个非负整数的标识符(identifier)加以引用。例如,为了对一个消息队列发送或取消息,只需知道其队列标识符。
3oz:Q#k QJpH;P0无论何时创建IPC结构(调用msgget、semget或shmget),都应指定一个关键字(key),关键字的数据类型由系统规定为key_t,通常在头文件<sys/types.h>中被规定为长整型。关键字由内核变换成标识符。
%npw g p~DL014.6.2许可权结构
C @ J0u{0系统V IPC为每一个IPC结构设置了一个ipc_perm结构。该结构规定了许可权和所有者。51Testing软件测试网 o2p8XP'?8|:GWbF3^
14.6.3结构限制
2I8p|M+H6Sikm014.6.4优点和缺点
,d z3O%XUw-L8o&T D0系统V IPC的主要问题是;IPC结构是在系统范围内起作用的,没有访问计数。
{4?+EU"GY\0系统V IPC的另一个问题是;这些IPC结构并不按名字为文件系统所知。我们不能用第3、4章中所述的函数来存取它们或修改它们的特性。为了支持它们不得不增加了十多个全新的系统调用(msgget、semop、shmat等)。我们不能用ls命令见到它们,不能用rm命令删除它们,不能用chmod命令更改它们的存取权。于是,也不得不增加了全新的命令ipcs和ipcrm。
L*_w,H)S1h7Y Xw3?0因为这些IPC不使用文件描述符,所以不能对它们使用多路转接I/O函数:select和poll。这就使得一次使用多个IPC结构,以及用文件或设备I/O来使用IPC结构很难做到。51Testing软件测试网Mt xx*uH8p%},vG
14.7消息队列
消息队列是消息的链接表,存放在内核中并由消息队列标识符标识。我们将称消息队列为“队列”,其标识符为“队列ID”。msgget用于创建一个新队列或打开一个现存的队列。msgsnd用于将新消息添加到队列尾端。msgrcv用于从队列中取消息。我们并不一定要以先进先出次序取消息,也可以按消息的类型字段取消息。
8{ e#P4?1k1r'[~xN0每个队列都有一个msqid_ds结构与其相关。此结构规定了队列的当前状态。51Testing软件测试网| ~H;[ L u
调用的第一个函数通常是msgget,其功能是打开一个现存队列或创建一个新队列。
]^+R\pkP`0#include <sys/types.h>
(I)TgvG_yzu0#include <sys/ipc.h>
C5r~e p B0#include <sys/msg.h>
b*m0Y&N#W0int msgget(key_tkey, int flag);51Testing软件测试网5Szs"f.pn!a*b
返回:若成功则为消息队列ID,若出错则为-1
W hc-]QUW)d"F0---------------------------------------------------------------------------------------------------------------------
3\{:M8wY Fy&m0msgctl函数对队列执行多种操作。它以及另外两个与信号量和共享存储有关的函数(semctl和shmctl)是系统V IPC的类似于ioctl的函数(亦即垃圾桶函数)。51Testing软件测试网eN:PY,t|'E
---------------------------------------------------------------------------------------------------------------------51Testing软件测试网_ As}(q
#include <sys/types.h>
"f9_/~8do0#include <sys/ipc.h>
)m+[PNAW:s0#include <sys/msg.h>
}f*w4]\U8uX@0int msgctl(intmsqid, int cmd, struct msqid_ds *buf);
Jqx3d,oQG0返回:若成功则为0,出错则为-151Testing软件测试网C_%CK4tx]R
---------------------------------------------------------------------------------------------------------------------
bPN:c~#k;G3xO0调用msgsnd将数据放到消息队列上。
CnZ@![5O0--------------------------------------------------------------------------------------------------------------------
AG+I-xEfkz:apY0#include <sys/types.h>
E$N#E9jg$R)Fl0#include <sys/ipc.h>51Testing软件测试网:`.w W,@Qb_
#include <sys/msg.h>
p9Ve/E ~1oXSP0int msgsnd(intmsqid, const void *ptr, size_tnbytes, int flag)51Testing软件测试网x%r$Q5y\+^Q)g4KL
返回:若成功则为0,若出错则为-1
c,vj4]DB0---------------------------------------------------------------------------------------------------------------------51Testing软件测试网 {4Y~2Vpjkz
msgrcv从队列中取用消息。51Testing软件测试网u`8p&HS,^`D
--------------------------------------------------------------------------------------------------------------------51Testing软件测试网d+GJ.f'^t n
#include <sys/types.h>51Testing软件测试网4t2t2q L M
#include <sys/ipc.h>51Testing软件测试网7M!} H8Do2qvI
#include <sys/msg.h>
#Q7A^'m-w;@)zMc2bI0int msgrcv(intmsqid, void * ptr , size_t nbytes, long type, int flag);
P(} d\e8i6R"},q?z0返回:若成功则为消息数据部分的长度,若出错则为-1
J5L0J'\C B%X.q0---------------------------------------------------------------------------------------------------------------------51Testing软件测试网 ~.j^r3x |3m
<
TAG:
我的栏目
标题搜索
日历
|
|||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
1 | 2 | 3 | 4 | ||||||
5 | 6 | 7 | 8 | 9 | 10 | 11 | |||
12 | 13 | 14 | 15 | 16 | 17 | 18 | |||
19 | 20 | 21 | 22 | 23 | 24 | 25 | |||
26 | 27 | 28 | 29 | 30 | 31 |
我的存档
数据统计
- 访问量: 159027
- 日志数: 220
- 图片数: 4
- 文件数: 1
- 书签数: 16
- 建立时间: 2007-04-27
- 更新时间: 2012-01-30