Linux中限定值、 常用基本系统数据类型和文件I/O

 


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;

常见写出错原因:磁盘已写满或超过一个给定进程的文件长度限制

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值