Chinaunix首页 | 论坛 | 博客
  • 博客访问: 76652
  • 博文数量: 35
  • 博客积分: 1640
  • 博客等级: 上尉
  • 技术积分: 400
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-05 11:44
文章分类

全部博文(35)

文章存档

2011年(1)

2008年(34)

我的朋友
最近访客

分类: C/C++

2008-05-05 12:58:38

套接口和标准I/O

我们一直适用Unix I/O,执行I/O的另一个方法是使用标准I/O函数库(standard I/O library)。这个函数库由ANSI C标准规范,意在便于
移植到支持ANSI C的非UNIX系统上。

标准I/O函数库可用于套接口,不过需要考虑以下几点。
(1)通过调用fdopen函数,可以从任何一个描述字创建出一个标准I/O流。类似地,通过调用fileno,可以获取一个给定标准I/O流对应的
描述字。例如,我们想在一个标准I/O流上调用select,select只能用于描述字,因此我们不得不获取那个标准I/O流的描述字。
(2)TCP和UDP套接口是全双工的。标准I/O流也可以是全双工的:只要以r+类型打开流即可,r+意味着读写。然而在这样的流上,我们必须在
调用一个输出函数之后,插入一个fflush、fseek、fsetpos或rewind调用再接着调用一个输入函数。同样,一个输入函数后也需要fseek、
fsetpos、rewind调用再跟一个输出函数,除非输入函数遇到一个EOF。fseek、fsetpos或rewind这3个函数的问题是,它们都调用lseek,
而lseek用在套接口上只会失败。
(3)解决上述读写问题的最简单的方法是为一个给定套接口打开两个标准I/O流:一个用于读,一个用于写。 

套接口超时

在涉及套接口的I/O操作上设置超时的方法有三个:
 (1)调用alarm,它在指定超时期满时产生SIGALRM信号。这个方法涉及信号处理,而信号处理在不同的实现上存在差异,而且可能
 干扰进程中现有的alarm调用。
 (2)在select中阻塞等待I/O(select有内置的时间限制),以此代替直接阻塞在read或write调用上。
 (3)使用较新的SO_RCVTIMEO和SO_SNDTIMEO套接口选项。但是并非所有实现都支持这两个套接口选项。
 上述三个技术都适用于输入和输出操作(例如read、write及其诸如recvfrom、sendto之类的变体),但是connect例外,因为TCP
 内置的connect超时相当长(典型值为75秒)。当相应套接口处于非阻塞模式,select可用于在connect上设置超时;而那两个套接口
 选项对connect并不适用。
 另外,前两个技术适用于任何描述字,而第三个技术仅适用于套接口描述字。

阅读(488) | 评论(0) | 转发(0) |
0

上一篇:C++Primer——string

下一篇:关于extern “C”

给主人留下些什么吧!~~