APUE 文件I/O 小结

手头有本《Unix环境高级编程 (APUE) 》,就在慢慢看,这两天把文件I/O看了看,现在总结一下。

这一章主要介绍的是非缓冲I/O(unbuffered I/O) ,表示每个read,write操作都进行一次系统调用,他不是标准C的一部分,是POSIX.1single UNIX Specification的一部分。知识点有一下几个部分。

文件描述符:内核向进程返回的一个非负整数,读写文件或进行相关操作的时候用他来标识文件。标准输入0,标准输出1,标准错误输出2分别由符号常量STDIN_FINLENO,STDOUT_FILENO,STDERR_FILENO表示。文件描述符一般选择未用的最小数,不超过OPEN_MAX(大多为63).

open函数:

#include<fcntl.h>

int open( const char * filename, int flag, ../* mode_t */ );

出错时候返回-1,成功返回文件描述符

flag可以是读(O_RDONLY),写(O_WRONLY),读写(O_RDWR),注意着三者不能用|来合并。还有一些可选的常量,比如,O_APPEND表示每次写都添加到文件末尾,O_CREAT创建文件时候要指定第三个参数文件权限,O_TRUNC打开文件时候清空。

lseek函数:

#include<unistd.h>

off_t lseek( int fd, off_t offset, int whence ) ;

成功时候返回偏移量,否则返回-1,虽然说off_t可以为负值,但是返回的时候的意义是相对于文件文件开头(SEEK_SET)的。

whence有三种(SEEK_SET, SEEK_CUR,SEEK_END),分别是相对于文件开始,当前偏移量,和文件结尾。当用lseek确定好要操作的文件位置之后,就能在返回的偏移位置上进行读写了。如果文件描述的是一个管道,FIFO或者网络套接字,则lseek返回-1,并将errno设置为ESPIPE。
(更多…)

继续阅读 →

linux编程初试

今天的java项目搞了一个下午,后来发现是一个小问题纠结了很长时间,悲剧。

刚刚12点,睡不着,就练习下linux编程吧,前段时间买了本《linux程序设计》,感觉挺好的,就随便看看。

照着例题敲了下,顺便总结下:

例程在P104,扫描目录。

本程序的目的是扫描一个目录,并且把目录下的内容输出出来,主要操作在printdir函数内完成。

DIR是一个目录流结构体,在dirent.h头文件中声明,目录流指针(DIR *)被用来完成各种目录操作,其使用方法与普通文件流指针(
FILE *)很相似,目录数据项在dirent结构体中返回,用户不能更改DIR中的字段。dirent结构题中包括d_ino表示文件的inode节点号,表示文件名的name等等,其相应的操作有:

(更多…)

继续阅读 →