⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000019.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<HTML><HEAD>  <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人:&nbsp;mry&nbsp;(木日),&nbsp;信区:&nbsp;Linux&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>标&nbsp;&nbsp;题:&nbsp;多进程编程&nbsp;<BR>发信站:&nbsp;BBS&nbsp;水木清华站&nbsp;(Thu&nbsp;Nov&nbsp;18&nbsp;21:04:41&nbsp;1999)&nbsp;<BR>&nbsp;<BR>多谢bug2k提供的网址&nbsp;<BR>=====================================================&nbsp;<BR>&nbsp;<BR>多进程编程&nbsp;<BR>写在前面的话&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;本文主要根据本人在UNIX系统上的编程实践经验总结而成,&nbsp;既做为自己在&nbsp;<BR>一个时期内编程实践的部分总结,&nbsp;又可成为文章发表.&nbsp;对UNIX程序员初学者来&nbsp;<BR>说是一个小小的经验,&nbsp;仅供参考;&nbsp;对UNIX老手来说则不值一哂,&nbsp;请各位多多指&nbsp;<BR>教.&nbsp;<BR>一.多进程程序的特点&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;由于UNIX系统是分时多用户系统,&nbsp;CPU按时间片分配给各个用户使用,&nbsp;而在&nbsp;<BR>实质上应该说CPU按时间片分配给各个进程使用,&nbsp;每个进程都有自己的运行环境&nbsp;<BR>以使得在CPU做进程切换时不会&quot;忘记&quot;该进程已计算了一半的&quot;半成品&quot;.&nbsp;以DOS&nbsp;<BR>的概念来说,&nbsp;进程的切换都是一次&quot;DOS中断&quot;处理过程,&nbsp;包括三个层次:&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;(1)用户数据的保存:&nbsp;包括正文段(TEXT),&nbsp;数据段(DATA,BSS),&nbsp;栈段&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(STACK),&nbsp;共享内存段(SHARED&nbsp;MEMORY)的保存.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;(2)寄存器数据的保存:&nbsp;包括PC(program&nbsp;counter,指向下一条要执行的指&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;令的地址),&nbsp;PSW(processor&nbsp;status&nbsp;word,处理机状态字),&nbsp;SP(stack&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pointer,栈指针),&nbsp;PCBP(pointer&nbsp;of&nbsp;process&nbsp;control&nbsp;block,进程控&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;制块指针),&nbsp;FP(frame&nbsp;pointer,指向栈中一个函数的local变量的首地&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;址),&nbsp;AP(augument&nbsp;pointer,指向栈中函数调用的实参位置),&nbsp;ISP(&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;interrupt&nbsp;stack&nbsp;pointer,中断栈指针),&nbsp;以及其他的通用寄存器等.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;(3)系统层次的保存:&nbsp;包括proc,u,虚拟存储空间管理表格,中断处理栈.&nbsp;<BR>以便于该进程再一次得到CPU时间片时能正常运行下去.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;既然系统已经处理好所有这些中断处理的过程,&nbsp;我们做程序还有什么要担&nbsp;<BR>心的呢?&nbsp;我们尽可以使用系统提供的多进程的特点,&nbsp;让几个程序精诚合作,&nbsp;简&nbsp;<BR>单而又高效地把结果给它搞出来.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;另外,UNIX系统本身也是用C语言写的多进程程序,多进程编程是UNIX的特&nbsp;<BR>点,当我们熟悉了多进程编程后,将会对UNIX系统机制有一个较深的认识.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;首先我介绍一下多进程程序的一些突出的特点:&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;1.并行化&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一件复杂的事件是可以分解成若干个简单事件来解决的,&nbsp;这在程序员&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;的大脑中早就形成了这种概念,&nbsp;首先将问题分解成一个个小问题,&nbsp;将小问&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;题再细分,&nbsp;最后在一个合适的规模上做成一个函数.&nbsp;在软件工程中也是这&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;么说的.&nbsp;如果我们以图的方式来思考,&nbsp;一些小问题的计算是可以互不干扰&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;的,&nbsp;可以同时处理,&nbsp;而在关键点则需要统一在一个地方来处理,&nbsp;这样程序&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;的运行就是并行的,&nbsp;至少从人的时间观念上来说是这样的.&nbsp;而每个小问题&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;的计算又是较简单的.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;2.简单有序&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这样的程序对程序员来说不亚于管理一班人,&nbsp;程序员为每个进程设计&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;好相应的功能,&nbsp;并通过一定的通讯机制将它们有机地结合在一起,&nbsp;对每个&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;进程的设计是简单的,&nbsp;只在总控部分小心应付(其实也是蛮简单的),&nbsp;就可&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;完成整个程序的施工.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;3.互不干扰&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个特点是操作系统的特点,&nbsp;各个进程是独立的,&nbsp;不会串位.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;4.事务化&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;比如在一个数据电话查询系统中,&nbsp;将程序设计成一个进程只处理一次&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;查询即可,&nbsp;即完成一个事务.&nbsp;当电话查询开始时,&nbsp;产生这样一个进程对付&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;这次查询;&nbsp;另一个电话进来时,&nbsp;主控程序又产生一个这样的进程对付,&nbsp;每&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;个进程完成查询任务后消失.&nbsp;这样的编程多简单,&nbsp;只要做一次查询的程序&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;就可以了.&nbsp;<BR>二.常用的多进程编程的系统调用&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;1.fork()&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;功能:创建一个新的进程.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;语法:#include&nbsp;&lt;unistd.h&gt;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;&lt;sys/types.h&gt;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pid_t&nbsp;fork();&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;说明:本系统调用产生一个新的进程,&nbsp;叫子进程,&nbsp;是调用进程的一个复&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;制品.&nbsp;调用进程叫父进程,&nbsp;子进程继承了父进程的几乎所有的属&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;性:&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;实际UID,GID和有效UID,GID.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;环境变量.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;附加GID.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;调用exec()时的关闭标志.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;UID设置模式比特位.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;GID设置模式比特位.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;进程组号.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;会话ID.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;控制终端.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;当前工作目录.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;根目录.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;文件创建掩码UMASK.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;文件长度限制ULIMIT.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;预定值,&nbsp;如优先级和任何其他的进程预定参数,&nbsp;根据种类不同&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;决定是否可以继承.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;还有一些其它属性.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;但子进程也有与父进程不同的属性:&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;进程号,&nbsp;子进程号不同与任何一个活动的进程组号.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;父进程号.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;子进程继承父进程的文件描述符或流时,&nbsp;具有自己的一个拷贝&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;并且与父进程和其它子进程共享该资源.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;子进程的用户时间和系统时间被初始化为0.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;子进程的超时时钟设置为0.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;子进程的信号处理函数指针组置为空.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;子进程不继承父进程的记录锁.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回值:&nbsp;调用成功则对子进程返回0,&nbsp;对父进程返回子进程号,&nbsp;这也是&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最方便的区分父子进程的方法.&nbsp;若调用失败则返回-1给父进程,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;子进程不生成.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;例子:pid_t&nbsp;pid;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((pid=fork())&gt;0)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*父进程处理过程*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -