嵌入式进程通信_第1页
嵌入式进程通信_第2页
嵌入式进程通信_第3页
嵌入式进程通信_第4页
嵌入式进程通信_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

重庆工商大学嵌入式系统设计课程设计报告设计题目 LINUX进程通信设计 学生姓名 专业班级 08计算机 指导老师 设计时间 2010.12.14至 2010.12.28 目录1.设计题目分析3分析:32.主要术语解析31.管道32. 进程43.管道的创建 pipe函数44.写管道w rite 函数45.读管道read 函数56.关闭管道close 函数57延时函数sleep()53.设计流程51.创建管道52.进程通信64.设计体会8附C程序源代码:81.设计题目分析题目:LINUX进程通信设计 编程实现LINUX操作系统对进程进行控制,利用管道或信号机制实现进程间通信,完成两程序间数据传递,并完成课程设计报告中。分析:本实验主要研究两个不同进程之间(父,子进程)的通信,因此采用简单易设计的无名管道。无名管道主要用于不同进程间通信,它是单向的、先进先出的、无结构的、固定大小的字节流,它把一个进程的标准输出和另一个进程的标准输入连接在一起。写进程在管道的尾端写入数据,读进程在管道的首端读出数据。数据读出后将从管道中移走,其它读进程都不能再读到这些数据。管道提供了简单的流控制机制。在进程之间进行通信的最简单方法是通过文件,其中一个进程写文件, 而另一个进程读文件。这种方法简单易行, 但容易造成内存空间和读文件时间的浪费,应用管道可克服这些缺点。管道实际上是在进程间开辟一个固定大小的缓冲区, 需要发布信息的进程运行写操作, 需要接收信息的进程运行读操作。管道是单向的字节流, 它把一个进程的标准输出和另一个进程的标准输人连接在一起。2.主要术语解析1.管道管道是进程间通信中最古老的方式,它包括无名管道和有名管道两种,前者可用于具有亲缘关系进程间的通信,即可用于父进程和子进程间的通信,后者则克服了管道没有名字的限制,因此,除具有前者所具有的功能外,它还允许无亲缘关系进程间的通信,即可用于运行于同一台机器上的任意两个进程间的通信。无名管道由pipe()函数创建:#include int pipe(int fd2);参数fd2返回两个文件描述符:fd0为读而打开,fd1为写而打开。fd0的输出是fd1的输入。在Linux系统下,有名管道可由两种方式创建:命令行方式mknod系统调用和函数mkfifo。下面的两种途径都在当前目录下生成了一个名为myfifo的有名管道:方式一:mkfifo(myfifo,rw);方式二:mknod myfifo p生成了有名管道后,就可以使用一般的文件I/O函数如open、close、read、write等来对它进行操作。2. 进程由fork创建的新进程被称为子进程( child process)。该函数被调用一次,但返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值则是子进程的进程ID。 一般来说,在f o r k之后是父进程先执行还是子进程先执行是不确定的。这取决于内核所使用的调度算法。父、子进程之间的区别是:fork的返回值; 进程I D、不同的父进程I D;子进程的tms _ utime , tms_stime , tms_cutime以及tms_ustime设置为0;父进程设置的锁,子进程不继承。3.管道的创建 pipe函数# include int pipe ( int fd 2)函数的参数中有两个文件描述符: fd0用于管道的read 端, fd1用于管道的write 端。创建成功则返回值0, 否则返回-1 值。4.写管道w rite 函数ret = write (fd 1, buf, n)若管道已满, 则被阻塞, 直到管道另一端read 将已进人管道的数据取走为止。5.读管道read 函数ret= read (fd0, buf, n)若管道为空, 且写端文件描述字未关闭, 则被阻塞。若管道写端已关闭, 则返回0。若管道不为空, 分两种情况: 设管道中实际有m个字节) , 如n = m , 则读m 个; 如果n0) /*若从pipe_fd0中读入到buf_r中的字节数大于0*/ printf(%d numbers read from the pipe is %sn,r_num,buf_r);父进程:将数据写入内存中if(write(pipe_fd1,Hello,5)!=-1) /*将字符串Hello输出到pipe_fd1中*/printf(parent write1 success!n); if(write(pipe_fd1, Pipe,5)!=-1) /*将字符串 Pipe输出到pipe_fd1中*/printf(parent write2 success!n);C程序流程图: 图(2)LINUX下的调试结果:4.设计体会两周的课程设计,加深了我对嵌入式这门课程的兴趣,也检验了我对这门课程的掌握,更培养了我的实践能力。通过这次课程设计,使我对进程间的通信有了全面的了解,熟悉了Linux下进程间的通信方式和原理。Linux 平台下进程间通信的方式很多, 其中以管道通信最能体现Linux 平台的特色。Linux 平台下的管道通信中,无名管道可用于具有亲缘关系进程间的通信; 命名管道除具有无名管道所具有的功能外, 它还允许无亲缘关系进程间的通信。管道常用于两个方面: 在shell 中时常会用到管道, 在这种应用方式下, 管道的创建对于用户来说是透明的;用于具有亲缘关系的进程间通信, 用户自己创建管道, 并完成读写操作。附C程序源代码:#include #include #include #include int main() int pipe_fd2; /*创建一个管道,包括两个整数的数组。如果系统调用成功,此数组将包括管道使用的两个文件描述符*/pid_t pid;char buf_r100; /*定义长度为100字节的数组*/int r_num;memset(buf_r,0,sizeof(buf_r); /*将buf_r中100个字节长度初始化为0*/if(pipe(pipe_fd)0) /*若从pipe_fd0中读入到buf_r中的字节数大于0*/ printf(%d numbers read from the pipe is %sn,r_num,buf_r);close(pipe_fd0); /*关闭不再需要的文件描述符*/exit(0); else if(pid0) /*父进程*/ close(pipe_fd0); if(write(pipe_fd1,Hello,5)!=-1) /*将字符串Hello输出到pipe_fd1中*/printf(parent write1 success!n); if(write(pipe_fd1, Pipe,5)!=-1) /*将字符串 Pipe输出到pipe_fd1中*/printf(paren

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论