1.获得特定系统实际支持的限定值:
1)编译时限制(头文件):/usr/include/limits.h
#include <unistd.h>
2)与文件或目录无关的限制
long sysconf(int name);
3)与文件或目录有关的限制
long fpathconf(int fd, int name);
long pathconf(char *path, int name);
2.UNIX中的基本系统数据类型
它们在/usr/include/sys/types.h中使用typedef定义,绝大部分以_t结尾
常用基本系统数据类型
clock_t 时钟滴答计数器(进程时间)
comp_t 压缩的时钟滴答
dev_t 设备号
fd_set 文件描述符集
fpos_t 文件位置
gid_t 数值组ID
ino_t i节点编号
mode_t 文件类型,文件创建模式
nlink_t 目录项的链接计数
off_t 文件长度和偏移量(有符号)
pid_t 进程ID和进程组ID(有符号)
pthread_t 线程ID
ptrdiff_t 两个指针相减的结果
rlim_t 资源限制
sig_atomaic_t 能原子性地访问数据类型
sigset_t 信号集
size_t 对象长度(不带符号的)
ssize_t 返回字节计数的函数(带符号的)
time_t 日历时间的秒计数器
uid_t 数值用户ID
wchar_t 能表示所有不同的字符码
3.文件I/O
说起文件I/O,那么不得不提一个名词——文件描述符。
对于内核而言,所有打开的文件都通过文件描述符引用,其是一个非负整数。当打开或创建一个文件时,内核向进程返回一个文件描述符用以标识文件,并将其作为参数传给相关函数。
文件描述符0,1,2分别对应标准输入(STDIN_FILENO),标准输出(STDOUT_FILENO),标准错误(STDERR_FILENO)。
文件描述符的变化范围是无限的,它只受到系统配置、整形的字长以及系统管理员所配置的软限制和硬限制的约束
相关函数介绍:
3.1 #include <sys/types.h>
#include <sys/stat.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
int creat(const char *pathname, mode_t mode);
int openat(int dirfd, const char *pathname, int flags);
int openat(int dirfd, const char *pathname, int flags, mode_t mode);
上述分别介绍的一对open和openat函数的区别是:只有当创建新文件使用时才使用最后一个参数,用于表示创建后文件的权限。
open和openat函数返回的文件描述符一定是最小的未使用的文件描述符数值,其区别如下:
1)path参数若指定的是绝对路径名,那么dirfd参数将被忽略,openat相当于open
2)path参数若指定的是相对路径名,那么dirfd参数指出了相对路径名在文件系统中的开始地址。dirfd参数是通过打开相对路径名所在的路径名所在的目录来获取
3)path参数若指定的是相对路径名,dirfd参数具有特殊值AT_FDCWD,此时路径名在当前工作目录中获取。
creat函数等效于open(path,O_WRONLY|O_CREAT|O_TRUNC,mode),creat默认以只写的方式打开所创建的文件
3.2 #include <unistd.h>
int close(int fd);
当使用close关闭文件时会释放该进程在文件上的所有锁记录。
3.3 #include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
在该函数中参数whence参数有三个值,其下面所加的的offset可正可负
1)当whence是SEEK_SET时,则该文件偏移量设置为距文件开始处offset个字节
2)当whence是SEEK_CUR时,则该文件偏移量设置为当前值加offset个字节
3)当whence是SEEK_END时,则该文件偏移量设置为文件长度加offset个字节
3.4 下面的一簇函数和3.3作用很类似,不过其是通过文件指针来进行操作,用法类似,这里就不再赘述。
#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);
long ftell(FILE *stream);
void rewind(FILE *stream);
int fgetpos(FILE *stream, fpos_t *pos);
int fsetpos(FILE *stream, fpos_t *pos);
3.5文件读写操作函数
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
ssize_t read(int fd, void *buf, size_t count);
read函数:返回值:读到的字节数,若已到文件尾,返回0;出错,返回-1;
实际读到的字节数小于要求读的字节数:
1)读普通文件时,读到文件末尾尚未达到要求字节数;
2)从终端设备读时,通常一次最多读一行;
3)从网络读时,网络中的缓冲机制可能引起返回值小于所要求读的字节数;
4)从管道读时,read只返回实际可用的字节数;
5)从面向记录的设备中读时一次最多返回一个记录。
write函数:返回值:若成功,返回已写的字节数;若出错,返回-1;
常见写出错原因:磁盘已写满或超过一个给定进程的文件长度限制