管道和socket编程.docx
- 文档编号:24105340
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:11
- 大小:1.10MB
管道和socket编程.docx
《管道和socket编程.docx》由会员分享,可在线阅读,更多相关《管道和socket编程.docx(11页珍藏版)》请在冰豆网上搜索。
管道和socket编程
管道和socket编程
《Unix/linux操作系统》
课程实验报告
专业
计算机系统结构
班级
(1)班
学号
1303210015
学生姓名
刘贺鹏
指导教师
陈老师
学期
2013-2014学年第2学期
完成日期
2014-6-10
实验内容
一、小议管道
Ø原理分析
如下图进程间通信
管道是一种最基本的IPC机制,由pipe函数创建:
调用pipe函数时在内核中开辟一块缓冲区(称为管道)用于通信,它有一个读端一个写端,然后通过fd参数传出给用户程序两个文件描述符,fd[0]指向管道的读端,fd[1]指向管道的写端(很好记,就像0是标准输入1是标准输出一样)。
所以管道在用户程序看起来就像一个打开的文件,通过read(fd[0]);或write(fd[1]);向这个文件读写数据其实是在读写内核缓冲区。
pipe函数调用成功返回0,调用失败返回-1。
intpipe(intfd[2])中的两个文件描述符被强制规定fd[0]只能指向管道的读端,如果进行写操作就会出现错误;同理fd[1]只能指向管道的写端,如果进行读操作就会出现错误。
开辟了管道之后如何实现两个进程间的通信呢?
比如可以按下面的步骤通信。
1.父进程调用pipe开辟管道,得到两个文件描述符指向管道的两端。
2.父进程调用fork创建子进程,那么子进程也有两个文件描述符指向同一管道。
3.父进程关闭管道读端,子进程关闭管道写端。
父进程可以往管道里写,子进程可以从管道里读,管道是用环形队列实现的,数据从写端流入从读端流出,这样就实现了进程间通信。
Ø程序代码解析
运行结果如下:
二、bc/dc通信
Ø对于tinybc.c的分析
这段程序涉及到pipe、fork、dup2、exec这几个函数。
下图显示了内核将用户连接到bc并将bc连接到dc的数据连接。
该段程序主要流程是"创建两个管道"→"创建子进程用来运行并重定向标准输入和标准输出到管道,然后运行execdc"→"父进程读取并分析用户的输入,将命令传给dc,dc读取响应,并把响应传给用户"。
下图是该段程序的流程图:
首先父进程从标准输入stdin向管道todc[1]端写入数据、子进程从todc[0]端读入数据(重定向后todc[0]端相当于子进程的stdin)并用dc-计算todc[0]端读入的数据、计算的结果从fromdc[1]端写入管道(重定向后from[1]端相当于子进程的stdout、最后父进程从from[0]端读取数据并输出。
Ø运行效果
在tinydc.c中使用了库函数fdopen。
它与fopen类似,返回一个FILE*类型的值,不同的是此函数以文件描述符而非文件作为参数。
使用fopen的时候,将文件名作为参数传给它。
fopen可以打开设备文件也可以打开常规的磁盘文件。
如只知道文件描述符而不清楚文件名的时候可以使用fdopen命令。
三、socket编程。
Øsocket通信基本流程图如下:
Ø源代码分析
服务端主要是,创建socket、绑定IP和端口、监听、接受连接、处理数据包、关闭连接。
客户端则主要是,创建socket、连接到服务器、发送请求、关闭连接。
echo客户端代码如下:
echo服务端代码如下:
Ø实验结果
需要注意的是:
内存中存储字节有两种方式,一种是小端字节序(低序字节储存在起始地址),第二种是大端字节序(高位字节存储在起始地址)。
而且这两种字节序都有在使用。
当两台机器通信时,为了避免字节序之间转换问题,系统提供了4个函数
四、实验环境
在Vmware10.0下的Ubuntu12.04系统。
五、实验心得
通过本次实验让我更加熟悉了管道的功能、socket通信机制。
之前一直没明白为什么在这里父进程要关闭管道读端,并且子进程要关闭管道写端,想了很久终于想通了...,原因如下:
因为上面的这个程序是要模拟父进程和子进程的管道读写操作,其中父进程用于向管道中写入数据,子进程用于向管道中读取数据,因此开始要关闭父进程的读文件描述符fd[0],以及关闭子进程的写文件描述符fd[1],这是为了模拟这个过程。
然后至于为什么父进程关闭管道的读文件描述符fd[0]后子进程还能读取管道的数据,是因为系统维护的是一个文件的文件描述符表的计数,父子进程都各自有指向相同文件的文件描述符,当关闭一个文件描述符时,相应计数减一,当这个计数减到0时,文件就被关闭,因此虽然父进程关闭了其文件描述符fd[0],但是这个文件的文件描述符计数还没等于0,所以子进程还可以读取。
也可以这么理解,父进程和子进程都有各自的文件描述符,因此虽然父进程中关闭了fd[0],但是对子进程中的fd[0]没有影响。
socket允许在不相关的进程间创建类似管道的连接,甚至可以通过socket连接其他主机上的进程。
socket通信机制的步骤是向内核请求建立socket、与服务器相连、传送数据、挂断。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 管道 socket 编程