展望2011

《unix环境高级编程》通读学习笔记(五)(第13、14章)

上一篇 / 下一篇  2007-08-04 18:06:11 / 个人分类:unix环境高级编程的学习记录

13精灵进程

m ?x^\&Qx0

13.1引言51Testing软件测试网 n4D0W;r0j\%Y:G

精灵进程(daemon)是生存期长的一种进程。它们常常在系统引导装入时起动,在系统关闭时终止。因为它们没有控制终端,所以说它们是在后台运行的。UNIX系统有很多精灵进程,它们执行日常事物活动。51Testing软件测试网5k7SN*d@&x q1@

 

%|w-Q&\jq#m%y0

13.2精灵进程的特征51Testing软件测试网^2C^q9p;E+r

所有精灵进程都以超级用户(用户ID0)的优先权运行。没有一个精灵进程具有控制终端—终端名称设置为问号(?)、终端前台进程组ID设置为-1。缺少控制终端可能是精灵进程调用了setsid的结果。除update以外的所有精灵进程都是进程组的首进程,对话期的首进程,而且是这些进程组和对话期中的唯一进程。update是它所在进程组(37)和对话期(37)中的唯一进程,但是该进程组的首进程(可能也是该对话期的首进程)已经终止。最后,应当引起注意的是所有这些精灵进程的父进程都是init进程。51Testing软件测试网J7Z7H L-C

 

2M5KM(aZ]| M^L0

13.3编程规则

x3t DE"[El F0

在编写精灵进程程序时需遵循一些基本规则,以便防止产生并不希望的交互作用。

{ {9p?0aA;}#wY0

(1)首先做的是调用fork,然后使父进程exit

*c/g9[Oz C \E0

(2)调用setsid以创建一个新对话期。51Testing软件测试网)]0yy hl/H4k]

(3)将当前工作目录更改为根目录。51Testing软件测试网!D/H:R0h{ R6aT6R

(4)将文件方式创建屏蔽字设置为051Testing软件测试网7D+`k&c\fBu-j

(5)关闭不再需要的文件描述符。51Testing软件测试网Z} H8r}l;kpq)z:\.H2q8c

 

Jm`nj @0

13.4出错记录

.em}Nx;[^$o9B;rh+M0

  与精灵进程有关的一个问题是如何处理出错消息。因为它没有控制终端,所以不能只是写到标准出错输出上。需要有一个集中的精灵进程出错记录设施。

D5I4`}a j0

13.4.1 SVR4log驱动程序

i;W1iQ0gC0

SVR4提供了一种流设备驱动程序,其界面具有流出错记录,流事件跟踪以及控制台记录功能。图13-1详细给出了这种设施的整个结构。51Testing软件测试网Zf.kf'FG?

有三个记录进程(logger):出错记录进程、跟踪记录进程以及控制台记录进程。每一条记录消息可以送给其中之一。

_q3ou7E(C4zH.I0

13.4.2 4.3+BSD syslog设施51Testing软件测试网 ?$D7|:|9]o

4.2BSD以来,广泛地应用了BSD syslog设施。大多数精灵进程使用这一设施。图13-2显示了syslog设施的详细组织结构。

"p-l*H'G1MN0

 

L;C#H/f)I4~p0

13.5客户机-服务器模型

a)@4S{F+t0h Y GHj{0

   精灵进程常常用作为服务器进程。确实,图13-2中,可以称syslogd进程为服务器,用户进程(客户机)用UNIX域数据报套接口向其发送消息。

lL6L9rE3N5w0

一般而言,服务器是一个进程,它等待客户机与其联系,提出某种类型的服务要求。图13-2中,由syslogd服务器提供的服务是记录出错消息。

:l+Ab$V(v`0

 51Testing软件测试网N|:\%])@8ZIe+[

14进程间通信

fs{l8SQ6y:y0

14.1引言51Testing软件测试网3@{8T#KX#jq4J8enz

   8章说明了进程控制原语并且观察了如何调用多个进程。但是这些进程之间交换信息的唯一方法是经由forkexec传送打开文件,或通过文件系统。本章将说明进程之间相互通信的其他技术IPCInterProcess Communication)。51Testing软件测试网{i/R|nX_;Sg*jZ0g

UNIX IPC已经是而且继续是各种进程通信方式的统称,其中极少能在所有UNIX的实现中进行移植。表14-1列出了不同实现所支持的不同形式的IPC51Testing软件测试网v@eru,F

本章将讨论经典的IPC;管道、FIFO、消息队列、信号量以及共享存储器。51Testing软件测试网qc@J/v.c

 51Testing软件测试网:e3})k)n$|W { `x/z

14.2管道51Testing软件测试网9aL#q+wT v-]

管道是UNIX IPC的最老形式,并且所有UNIX系统都提供此种通信机制,管道有两种限制;

7Rk"_@;zbM0

(1)它们是半双工的。数据只能在一个方向上流动。

1vj_$Vu?0

(2)它们只能在具有公共祖先的进程之间使用。通常,一个管道由一个进程创建,然后该进程调用fork,此后父、子进程之间就可应用该管道。51Testing软件测试网!|a-n2kC o

管道是由调用pipe函数而创建的。

JML:Or6W8]0

——————————————————————————————————————51Testing软件测试网$fT*H-d'N3Qo-Xj

#include <unistd.h>51Testing软件测试网{0}ot!YX3TZz(p

int pipe(intfiledes[2]) ;

4Uz.Jf"{ c0

                                        返回:若成功则为0,若出错则为-1

7E'My$OTNGP\0

有两种方法来描绘一个管道,见图14-1。左半图显示了管道的两端在一个进程中相互连接,右半图则说明数据通过内核在管道中流动。51Testing软件测试网 fc Ae.D

单个进程中的管道几乎没有任何用处。通常,调用pipe的进程接着调用fork,这样就创建了从父进程到子进程或反之的IPC通道。图14-2显示了这种情况。

Y5i-waW \0

fork之后做什么取决于我们想要有的数据流的方向。对于从父进程到子进程的管道,父进程关闭管道的读端(fd[0]),子进程则关闭写端(fd[1])。图14-3显示了描述符的最后安排。51Testing软件测试网RUnr~4@7Z9rO

 51Testing软件测试网N|G1{ y$q)xc

14.3 popenpclose函数

0KB:U%xrd [|?\,R0

因为常见的操作是创建一个连接到另一个进程的管道,然后读其输出或向其发送输入,所以标准I/O库为实现这些操作提供了两个函数popenpclose。这两个函数实现的操作是:创建一个管道,fork一个子进程,关闭管道的不使用端,exec一个shell以执行命令,等待命令终止。

"C`Z_T(k#xsum0

____________________________________________________________________________51Testing软件测试网u+A6R'C.I

#include <stdio.h>51Testing软件测试网ngh fetn

FILE *popen(const *charcmdstring, const char *type);

hKJ n3u!v J I0

                            返回:若成功则为文件指针,若出错则为NULL

.E7I$m*P$Z0

int pclose(FILE *fp);51Testing软件测试网;w"o6U)|I

                            返回:cmdstring的终止状态,若出错则为-151Testing软件测试网~^jB#By3S5Vj"E

 

T:_c o ^+D*cbt0

14.4协同进程

-h+{K5\9{ ZWR0

UNIX过滤程序从标准输入读取数据,对其进行适当处理后写到标准输出。几个过滤进程通常在shell管道命令中线性地连接。当同一个程序产生某个过滤程序的输入,同时又读取该过滤程序的输出时,则该过滤程序就成为协同进程(coprocess)51Testing软件测试网}Fopn'ia:}:g

协同进程的工作方式在C程序中也是非常有用的.51Testing软件测试网U6MKBT

 

{2c)v)l5ZL k9L0

14.5 FIFO51Testing软件测试网Z zK1v&hI5y

    FIFO有时被称为命名管道。管道只能由相关进程使用,它们共同的祖先进程创建了管道。但是,通过FIFO,不相关的进程也能交换数据。51Testing软件测试网 me@$f([zuJ

    14章已经提及FIFO是一种文件类型。创建FIFO类似于创建文件。确实,FIFO的路径名存在于文件系统中。51Testing软件测试网-J&s8Yp x UD'z

----------------------------------------------------------------------------------------------------------------------

9q!V)ZNd C0

#include   <sys/types.h>

0B&h~ Q_$L!B^0

#include   <sys/stat.h>51Testing软件测试网)?a8gODY7j

int mkfifo(const *charpathname, mode_tmode);51Testing软件测试网,KBJ[\[d

                                          返回:若成功则为0,若出错则为-151Testing软件测试网@%?k-Os/F@ b

    一旦已经用mkfifo创建了一个FIFO,就可用open打开它。确实,一般的文件I/O函数(closereadwriteunlink等)都可用于FIFO51Testing软件测试网h(F3^an(I-g z

    FIFO有两种用途:51Testing软件测试网+S$}8P;ey5@{v

    (1) FIFOshell命令使用以便将数据从一条管道线传送到另一条,为此无需创建中间临时文件。51Testing软件测试网tGE\]

    (2) FIFO用于客户机-服务器应用程序中,以在客户机和服务器之间传递数据。51Testing软件测试网#n:R]9jtij/w)G

 51Testing软件测试网x8N&f.zm+J P

14.6系统V IPC51Testing软件测试网1A3vT?#Fhe

   三种系统V IPC:消息队列、信号量以及共享存储器之间有很多相似之处。51Testing软件测试网gr/Vtw#i

14.6.1标识符和关键字

C5_2a(w g h0

每个内核中的IPC结构(消息队列、信号量或共享存储段)都用一个非负整数的标识符(identifier)加以引用。例如,为了对一个消息队列发送或取消息,只需知道其队列标识符。

3oz:Q#kQJ pH;P0

无论何时创建IPC结构(调用msggetsemgetshmget,都应指定一个关键字(key),关键字的数据类型由系统规定为key_t,通常在头文件<sys/types.h>中被规定为长整型。关键字由内核变换成标识符。

%npw g p~DL0

14.6.2许可权结构

C @ J0u{0

系统V IPC为每一个IPC结构设置了一个ipc_perm结构。该结构规定了许可权和所有者。51Testing软件测试网o2p8XP'?8|:GWbF3^

14.6.3结构限制

2I8p|M+H6Sikm0

14.6.4优点和缺点

,dz3O%XUw-L8o&T D0

系统V IPC的主要问题是;IPC结构是在系统范围内起作用的,没有访问计数。

{4?+EU"G Y\0

系统V IPC的另一个问题是;这些IPC结构并不按名字为文件系统所知。我们不能用第34章中所述的函数来存取它们或修改它们的特性。为了支持它们不得不增加了十多个全新的系统调用(msggetsemopshmat等)。我们不能用ls命令见到它们,不能用rm命令删除它们,不能用chmod命令更改它们的存取权。于是,也不得不增加了全新的命令ipcsipcrm

L*_w,H)S1h7Y Xw3?0

因为这些IPC不使用文件描述符,所以不能对它们使用多路转接I/O函数:selectpoll。这就使得一次使用多个IPC结构,以及用文件或设备I/O来使用IPC结构很难做到。51Testing软件测试网Mt xx*uH8p%},vG

 

\2Lj9]Od8K~X H0

14.7消息队列51Testing软件测试网(]&Y.T6r c;Q1V W

消息队列是消息的链接表,存放在内核中并由消息队列标识符标识。我们将称消息队列为“队列”,其标识符为“队列ID”。msgget用于创建一个新队列或打开一个现存的队列。msgsnd用于将新消息添加到队列尾端。msgrcv用于从队列中取消息。我们并不一定要以先进先出次序取消息,也可以按消息的类型字段取消息。

8{ e#P4?1k1r'[~xN0

每个队列都有一个msqid_ds结构与其相关。此结构规定了队列的当前状态。51Testing软件测试网|~ H;[ L u

调用的第一个函数通常是msgget,其功能是打开一个现存队列或创建一个新队列。

]^+R\pkP`0

 

!fP/@.t K$IMi4_0

#include <sys/types.h>

(I)TgvG_yzu0

#include <sys/ipc.h>

C5r~ep B0

#include <sys/msg.h>

b*m0Y&N#W0

int msgget(key_tkey, int flag);51Testing软件测试网5Szs"f.pn!a*b

                             返回:若成功则为消息队列ID,若出错则为-1

W hc-]QUW)d"F0

---------------------------------------------------------------------------------------------------------------------

3\{:M8w Y Fy&m0

msgctl函数对队列执行多种操作。它以及另外两个与信号量和共享存储有关的函数(semctlshmctl)是系统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@0

int msgctl(intmsqid, int cmd, struct msqid_ds *buf);

Jqx3d,oQ G0

                                          返回:若成功则为0,出错则为-151Testing软件测试网C_%CK4tx]R

---------------------------------------------------------------------------------------------------------------------

bPN:c~#k;G3xO0

 

7pz(yH.D y fz0

调用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~1oXSP0

int msgsnd(intmsqid, const void *ptr, size_tnbytes, int flag)51Testing软件测试网x%r$Q5y\+^Q)g4KL

                                         返回:若成功则为0,若出错则为-1

c,vj4] DB0

---------------------------------------------------------------------------------------------------------------------51Testing软件测试网 {4Y~2Vpj kz

 

H g;jgr4H0

msgrcv从队列中取用消息。51Testing软件测试网u`8p&HS,^` D

--------------------------------------------------------------------------------------------------------------------51Testing软件测试网d+G J.f'^t n

#include <sys/types.h>51Testing软件测试网4t2t2q L M

#include <sys/ipc.h>51Testing软件测试网7M!} H8Do2q vI

#include <sys/msg.h>

#Q7A^'m-w;@)zMc2bI0

int 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

 

`+Zz9tew;I}y M0

<

TAG:

 

评分:0

我来说两句

Open Toolbar