资源描述:
《嵌入式进程通信.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、重庆工商大学《嵌入式系统设计》课程设计报告设计题目LINUX进程通信设计学生姓名专业班级08计算机指导老师设计时间2010.12.14至2010.12.28目录1.设计题目分析3分析:32.主要术语解析31.管道32.进程43. 管道的创建pipe函数44.写管道write函数45.读管道read函数56.关闭管道close函数57.延时函数sleep()53.设计流程51.创建管道52.进程通信64.设计体会8附C程序源代码:81.设计题目分析题目:LINUX进程通信设计编程实现LINUX操作系统对进程进行控
2、制,利用管道或信号机制实现进程间通信,完成两程序间数据传递,并完成课程设计报告中。分析:本实验主要研究两个不同进程之间(父,子进程)的通信,因此采用简单易设计的无名管道。无名管道主要用于不同进程间通信,它是单向的、先进先出的、无结构的、固定大小的字节流,它把一个进程的标准输出和另一个进程的标准输入连接在一起。写进程在管道的尾端写入数据,读进程在管道的首端读出数据。数据读出后将从管道中移走,其它读进程都不能再读到这些数据。管道提供了简单的流控制机制。在进程之间进行通信的最简单方法是通过文件,其中一个进程写文件,而
3、另一个进程读文件。这种方法简单易行,但容易造成内存空间和读文件时间的浪费,应用管道可克服这些缺点。管道实际上是在进程间开辟一个固定大小的缓冲区,需要发布信息的进程运行写操作,需要接收信息的进程运行读操作。管道是单向的字节流,它把一个进程的标准输出和另一个进程的标准输人连接在一起。2.主要术语解析1.管道 管道是进程间通信中最古老的方式,它包括无名管道和有名管道两种,前者可用于具有亲缘关系进程间的通信,即可用于父进程和子进程间的通信,后者则克服了管道没有名字的限制,因此,除具有前者所具有的功能外,它还允许无亲缘
4、关系进程间的通信,即可用于运行于同一台机器上的任意两个进程间的通信。 无名管道由pipe()函数创建: #include intpipe(intfd[2]); 参数fd[2]返回两个文件描述符:fd[0]为读而打开,fd[1]为写而打开。fd[0]的输出是fd[1]的输入。 在Linux系统下,有名管道可由两种方式创建:命令行方式mknod系统调用和函数mkfifo。下面的两种途径都在当前目录下生成了一个名为myfifo的有名管道: 方式一:mkfifo("myfifo","rw
5、"); 方式二:mknodmyfifop 生成了有名管道后,就可以使用一般的文件I/O函数如open、close、read、write等来对它进行操作。2.进程由fork创建的新进程被称为子进程(childprocess)。该函数被调用一次,但返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值则是子进程的进程ID。一般来说,在fork之后是父进程先执行还是子进程先执行是不确定的。这取决于内核所使用的调度算法。父、子进程之间的区别是:fork的返回值;进程ID、不同的父进程ID;子进程的tms_u
6、time,tms_stime,tms_cutime以及tms_ustime设置为0;父进程设置的锁,子进程不继承。3. 管道的创建pipe函数#includeintpipe(intfd[2])函数的参数中有两个文件描述符:fd[0]用于管道的read端,fd[1]用于管道的write端。创建成功则返回值0,否则返回-1值。4.写管道write函数ret=write(fd[1],buf,n)若管道已满,则被阻塞,直到管道另一端read将已进人管道的数据取走为止。5.读管道read函数ret=r
7、ead(fd[0],buf,n)若管道为空,且写端文件描述字未关闭,则被阻塞。若管道写端已关闭,则返回0。若管道不为空,分两种情况:设管道中实际有m个字节),如n>=m,则读m个;如果n8、间,不做任何操作,括号内为挂起的秒数。3.设计流程1.创建管道(1)创建一个简单的无名管道,使用系统调用pipe()。它接受一个参数,也就是一个包括两个整数的数组。如果系统调用成功,此数组将包括管道使用的两个文件描述符。创建一个管道之后,一般情况下进程将产生一个新的进程。系统调用:pipe();原型:intpipe(intfd[2]);(2)通过fork函数创建一个子进程。在子进程中正