




已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Unix程序设计基础 第三讲 谢翰 2004-2-10 Reviews of last class n进程 n独立地址空间的指令序列 n五种状态基本状态:新建,就绪,运行,睡 眠,僵死 n状态转换图 n进程ID,子进程,父进程 nUnix下的多进程编程 nfork与execve:进程的创建与程序的运行 nwait,waitpid:回收子进程的退出状态 Reviews of last class n信号 n是Unix操作系统用来通知进程发生了某种事 件的一种手段。也称为软件中断 n几个常用的信号 n信号编程 nsignal与sigaction:改变信号动作 nalarm:设置闹钟 n不可重入函数: n在函数返回之前不可再次被调用,如printf, malloc。 信号编程(续) n功能更强的改变信号动作函数:sigaction。 n解决早期signal函数的不可靠问题:在信号处理 过程中再次收到这个信号怎么办? n一般情况下用不到,请自己看书。 n发送信号函数kill与raise。 函数原型: #include int kill(pid_t pid, int sig); int raise(int sig); 信号的发送 nkill给进程号为pid的进程发送一个sig信号 npid 0:发送给进程ID为pid的进程 npid = 0:发送给与自己同组,并且自己有 权限向其发送的进程 npid 0) ; 进程间通信(IPC) n著名Unix与网络专家Richard Stevens,有多 本Unix著作,本本经典。 nAdvanced Programming In the Unix Environment (APUE) nTCP/IP Illustrated volume 1, 2, 3 nUnix Network Programming (UNP) volume 1, 2 n1999年9月30号去世TT,UNP volume 3没有 写完。 进程间通信(IPC) nUNP volume 2:用了一本书来讲IPC n所以,我不可能在半节课之内涵盖IPC的 各个方面,只能讲一些最基本,也是最 重要的: n管道通信 nFIFO通信 管道通信 n最古老的Unix IPC工具,一个进程从管道 一头写数据,另一个进程从管道另一头 读数据。相通信方式是单向的。 n(演示shell下的管道通信) n先了解一下进程创建过程中文件描述字 的继承。 单个进程打开两个文件 fork之后 管道通信 n创建管道pipe 函数原型: #include int pipe(int fdes2); pipe函数成功后,内核打开两个文件描 述字fdes0,fdes1。fdes0输入端, fdes1为输出端。 当进程调用了pipe fork被调用后 两个进程分别关闭一个端 int main(void) pid_t pid; int fdes2; if (pipe(fdes) 0) close(fdes0); write(fdes1, “Hmmmmmmmmmmm”, 12); /* 1 2 3 4 5 6 7 8 9 0 1 2 */ else char buf4096; ssize_t n; close(fdes1) n = read(fdes0, buf, 4096); if (n = 0) bufn = 0; printf(“%sn”, buf); return 0; 管道破裂 n如果一个管道的读端已经关闭,进程还继 续向写端写数据,如: pipe(fdes); close(fdes0); write(fdes1, “Let me die”, 10); 则进程会收到一个SIGPIPE信号,表示管 道破裂。默认动作为结束进程。 n读一个写端已经关闭的管道则read返回0。 FIFO通信 nFIFO是一种特殊设备文件,又称为有名管 道。操作方法与普通文件相同。 n对于普通文件,我们可以从文件任一位置 读数据,也可以从任一位置写数据;数据 读完不会消失。但对FIFO来说,我们只能 从文件头读数据,从文件尾写数据。数据 被某进程读走之后就会消失。 n(实例演示) FIFO相关的调用和shell命令 n创建设备文件FIFO:mkfifo 函数原型: #include #include int mkfifo(const char *filename, mode_t mode); nshell命令: $ mkfifo m 0600 fifo1 线程简介 nLinux下的clone系统调用可以实现比fork 更多的功能,比如让创建出来的子进程 分享父进程的地址空间。 n习惯上把这些与父进程分享地址空间的 子进程称为线程(Thread)。 n不同的系统对线程有不一样的定义,但 相同之处是它比进程的开消小,因此也 被称为是轻量级进程。 线程简介 n因为地址空间共享使得线程之间的通信非 常方便,但必须特别注意数据一致性。 nPosix定了标准的线程接口,请参考UNP volume 1,Chapter 23 高级IO nI/O的方式有很多种,我们之前使用的IO 方式的特点是: n单路:只能等待一个fd可读或可写 n阻塞:睡眠直到fd可读或可写 n同步:read和write必须结束才返回? n因此有与之对应的: n多路:同时等待多个fd可读或可写 n非阻塞:fd不可读或不可写立即返回 n异步:I/O没有结束read和write也可返回 非阻塞I/O n以非阻塞方式打开一个文件,如: fd = open(“love.txt”, O_RDWR | O_NONBLOCK, 0); n也可以用fcntl让一个已经打开的文件描述 字变成非阻塞: flags = fcntl(fd, F_GETFL, 0); fcntl(fd, F_SETFL, flags | O_NONBLOCK); 非阻塞I/O n对一个非阻塞的fd来说,如果它无数据可 读,则read(fd, );返回-1,errno的值被 置为EAGAIN;同样,如果它暂时不可写, write(fd, );返回-1,errno=EAGAIN。( 阻塞式I/O在这两种情况下都是等待)。 n注意:应当区为无数据可读与文件已经读 到结尾。后者read返回0,无论阻塞否。 n非阻塞I/O经常与多路I/O配合使用。 多路I/O n想像一个fd集合fdset,以及一个函数fun, 我们指定:调用fun(fdset)进程进入睡眠, 直到fdset中至少有一个fd可读,此时fun返 回并把可读的fd保存在fdset中。 n这样做的好处是,我们可以同时从多个fd 中等待数据,如果某一个可读我们就从中 读取,否则就睡眠。 多路I/O nUnix下就存在这种的一个fun,但它的功能更加强大 。它就是select(在有的系统下为poll,Linux都支持 ) 函数原型: #include #include int select(int m
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年门面租赁合同范本
- 2025河南郑州城建职业学院招聘管理岗、教师、辅导员考前自测高频考点模拟试题(含答案详解)
- 2025标准版委托贷款合同样本
- 2025机械设备的货物买卖合同
- 2025设备租赁合同书范本
- 2025年我国合同法中格式合同缺陷的法律调整及不安抗辩权的适用条件
- 2025年版个人借款合同范本下载
- 2025合规的独家经销合同
- 2025年浙江大学医学院附属邵逸夫医院招聘派遣岗位21人模拟试卷及答案详解(各地真题)
- 文秘业务考试题库及答案
- 氟喹诺酮类药物残留的检测课件
- 配电网工程施工工艺规范课件
- 档案收集与整理课件
- 全国编辑记者资格证考试复习资料
- 心理健康教育教案八年级
- 高速公路路政巡查记录表
- 消渴痹证(糖尿病周围神经病变)中医临床路径及诊疗方案
- 聚氨酯防水涂料检测作业指导书
- 分光光度法分析磷原始记录表
- 计量经济学重点知识整理
- 呆滞物料管理规定呆滞物料的处理流程呆滞物料的奖惩
评论
0/150
提交评论