Unix网络编程--文件IO(1) 基本API

什么是I/O
输入/输出是内存和外设之间拷贝数据的过程:
设备->内存: 输入操作
内存->设备: 输出操作
高级I/O: ANSI C提供的标准I/O库函数成为高级I/O, 也称为带缓冲的I/O;
低级I/O: Linux 提供的系统调用, 通常也称为不带缓冲的I/O;

文件描述符
在网络编程中,我们经常会得到监听套接字描述符已连接套接字描述符。而当我们打开文件就会获得文件描述符,它是个很小的正整数。每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。一个进程启动时,默认打开了3个文件,标准输入、标准输出、标准错误,对应的文件描述符是0(STDIN_FILENO)、1(STDOUT_FILENO)、2(STDERR_FILENO),这些常量定义在unistd.h头文件中。注:括号内的就代表文件指针File*。
文件描述符和文件指针的转换函数:

fileno: 将文件指针转换成文件描述符

int fileno(FILE *stream);

fdopen: 将文件描述符转换成文件指针

FILE *fdopen(int fd, const char *mode);
int main()  
{  
    printf("fileno(stdin)= %d\n",fileno(stdin));  
    /*fileno(stdin)=0*/  
}   

基本API

基本API,就是要从最基本的说起,现在我们先来明白freadread的区别:
fread返回的是一个FILE结构指针,而read返回的是一个int的文件描述符,前者fopen/fread的实现是靠调用底层的open/read来实现的.

fopen/fread
是C标准的库函数,操作的对象是:file stream

open/read
是和操作系统有关的系统调用。操作的对象是:file descriptor

简单一点说,f是ANSI的C标准库,后面的是UNIX下的系统调用,如果要和底层硬件打交道,必须是后面的!

1.open/fopen
打开成功返回文件描述符;打开失败返回-1。
int open(const char *pathname, int flags);

pathname: 文件名, 可以包含[绝对/相对]路径名;
flags: 文件打开模式

这里写图片描述

#include <sys/stat.h> 
#include <fcntl.h> // 包含close所需要的头文件 
#include <unistd.h> 
int main(int argc, char *args[]) { 
// 以只读方式打开一个存在的文件 
   int fd1 = open("a.txt", O_RDONLY); 
   printf("fd1 = %d\n", fd1); 
   close(fd1);
   // 以只读方式打开一个不存在的文件 
   int fd2 = open("b.txt", O_RDONLY); 
   printf("fd2 = %d\n", fd2);
   close(fd2); return 0; 
 }

notes:fd1的值为-1,fd2的值为3,由于文件描述符0、1、2已经默认存在了,因此,新打开的文件的文件描述符是从3开始的。

#include<stdio.h>
FILE * fopen(const char * path,const char * mode);
/*文件顺利打开后,指向该流的文件指针就会被返回。若果文件打开失败则返回NULL,并将错误代码存在error中*/

2.close/fclose

int close(int fd);

关闭文件描述符, 使得文件描述符得以重新利用,一个进程结束时也会主动关闭所有的文件。

int fclose(FILE * stream);

fclose()用来关闭先前fopen()打开的文件。此动作会让缓冲区内的数据写入文件中,并释放系统所提供的文件资源。

3.read/fread

ssize_t read(int fd, void *buf, size_t count);
/*ssize_t 是int型(无符号整型),占4个字节,在64位计算机系统中,ssize_t是long int 型,占8个字节*/

返回从文件复制到缓冲区的字节数,count:从该文件复制到buf的字节个数。

ssize_t fread(void * ptr,ssize_t size,ssize_t count,FILE * stream);
/*fread() 用来从文件流中读取数据,返回实际读取到的count数目*/

stream:已打开的文件指针
ptr:指向欲存放读取进来的数据空间,读取的字符数以参数size*count来决定

4.wirte/fwrite

ssize_t write(int fd, const void *buf, size_t count);  
/*write返回大于0时, 并不代表buf的内容已经写入到磁盘上的文件中了, 其仅仅代表buf中的数据已经copy到相应的内核缓冲区高速缓冲*/
ssize_t fwrite(const void * ptr,size_t size,size_t count,FILE * stream);

5.iseek/fseek

off_t lseek(int fd, off_t offset, int whence); 
/*off_t是一个long的类型别名*/
int fseek(FILE *stream, long offset, int fromwhere);
/*fseek 用于二进制方式打开的文件,移动文件读写指针位置*/

stream为文件指针;offset为偏移量,整数表示正向偏移,负数表示负向偏移;origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET
SEEK_SET: 文件开头
SEEK_CUR: 当前位置
SEEK_END: 文件结尾
其中SEEK_SET,SEEK_CUR和SEEK_END和依次为0,1和2:
fseek(fp,100L,0):把fp指针移动到离文件开头100字节处;
fseek(fp,100L,1):把fp指针移动到离文件当前位置100字节处;
fseek(fp,100L,2):把fp指针退回到离文件结尾100字节处。

参考博文:
http://www.cnblogs.com/liuliunumberone/archive/2011/05/06/2038628.html
http://blog.csdn.net/nk_test/article/details/48215061

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《UNIX网络编程(第三版)》是由W. Richard Stevens和Bill Fenner合著的一本经典著作。该书深入讲解了UNIX操作系统网络编程的相关知识和技巧,是学习UNIX网络编程的优秀资料。 这本书主要分为两部分,第一部分介绍了UNIX网络编程基本概念和基础知识。作者从TCP/IP协议栈、套接字编程接口、进程间通信等基本概念入手,详细解析了UNIX网络编程的核心技术。此外,还介绍了UNIX操作系统网络编程的原理与实践,包括网络编程API、套接字选项、IO复用技术等。这部分内容全面详细,对于初学者来说很容易理解和上手。 第二部分则是实际应用方面的内容。作者通过具体的实例,深入探讨了UNIX网络编程在实际项目的应用。包括网络连接、TCP和UDP服务器、多进程/多线程服务器、域名解析、广播和组播等。通过这些实例,读者可以更好地理解和运用UNIX网络编程的技术和方法。 《UNIX网络编程(第三版)》在内容上全面而深入,实用性强。这本书既适合初学者作为学习的入门教材,也适合有一定经验的开发人员作为手册和工具书。此外,该书的编写风格清晰简练,结构合理,配有大量实例和图示,有助于读者更好地理解和运用所学的知识。 总之,《UNIX网络编程(第三版)》是一本经典的UNIX网络编程指南,无论是对于初学者还是有经验的开发人员,都是一本不可多得的优秀参考书。阅读和学习该书的内容,不仅可以提升对UNIX网络编程的理解和应用水平,还能够为进一步深入学习和研究相关领域提供坚实的基础。 ### 回答2: 《UNIX网络编程 第三版》(英文版)是由W. Richard Stevens和Bill Fenner编著的一本网络编程方面的经典参考书籍。 该书深入讲解了UNIX操作系统下网络编程的各个方面,包括套接字编程、进程控制、线程编程、信号处理、I/O复用、套接字选项、多播、广播、多路复用器、非阻塞I/O、地址转换、名字和地址转换等等。此外,该书还介绍了UNIX系统的底层协议,如TCP/IP和UDP/IP,并详细解释了网络编程的各种细节和技巧。 《UNIX网络编程 第三版》以其深入浅出的讲解风格和丰富的示例代码而闻名,每个章节都有大量的代码示例和案例,便于读者理解和实践。此外,书还包含了大量的图表和图示,帮助读者更好地理解网络编程的各个概念和过程。 此外,《UNIX网络编程 第三版》还包含了关于IPv6的内容,对IPv6进行了深入讲解和示例演示,使读者能够了解并应用最新的网络技术。 总之,这本书是一本非常权威和全面的UNIX网络编程参考书籍,不仅适合网络编程从业人员和学习者,也适用于正在进行网络编程项目的开发人员。无论是初学者还是有经验的专业人士,都可以从获得不少的收获。如果你对UNIX网络编程感兴趣或需要进行相关开发,这本书是一本不可或缺的参考资料。 ### 回答3: 《UNIX网络编程 第三版》是由W. Richard Stevens和Bill Fenner共同编写的经典图书。这本书是Unix网络编程领域的权威和经典之作,被广泛认为是学习Unix系统编程和网络编程的指南。 这本书首先介绍了Unix网络编程基本概念和原理,包括套接字、地址族、TCP/IP协议等。然后,它详细介绍了Unix网络编程的各个方面,包括套接字编程、多进程和多线程编程、I/O多路复用、UDP编程、域名解析等。 书采用了清晰易懂的语言,配合大量的示例代码和图表,帮助读者理解和掌握Unix网络编程的核心概念和技术。它不仅注重理论知识的介绍,还强调实际应用和问题解决,为读者提供了大量实用的编程经验和技巧。 此外,第三版还新增了一些内容,如IPv6编程、高级I/O、Scoket选项、Socket超时、IP选项处理等,以适应当今互联网发展的需求。 总的来说,《UNIX网络编程 第三版》是Unix系统和网络编程领域的经典教材,不仅适合想要深入了解Unix网络编程的学生和开发人员,也是Unix系统管理员和网络工程师的必备参考书。它既具备理论性,又注重实践应用,可以帮助读者更好地理解和应用Unix网络编程技术,提高系统和网络的性能和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值