二、Linux--文件I/O、文件和目录

文件描述符本质上非负整数

1.open

头文件:

#include<sys/types.h>

#include<sys/stat.h>

#include<fcntl.h>

定义函数:

Int open(const char  *pathname,  int  flags);

Int open(const char  *pathname,  int  flags,  mode_t   mode);

函数说明:

open返回的文件描述符一定是最小的未被使用的描述符。

mode如果文件不存在,是新建的,则可以利用mode设置文件权限。

pathname 指向欲打开的文件路径字符串。

flag 标志位:

下列是参数flags 所能使用的标志位:

O_RDONLY以只读方式打开文件

O_WRONLY以只写方式打开文件

O_RDWR以可读写方式打开文件。

上述三种标志位是互斥的,也就是不可同时使用,但可与下列的标志位利用OR(|)运算符组合。

O_APPEND      每次写操作都写入文件的末尾

O_CREAT 如果指定文件不存在,则创建这个文件

O_EXCL 如果要创建的文件已存在,则返回-1,并且修改errno的值

O_TRUNC 如果文件存在,并且以只写/读写方式打开,则清空文件全部内容(即将其长度截短为0)

O_NOCTTY 如果路径名指向终端设备,不要把这个设备用作控制终端。

O_NONBLOCK 如果路径名指向FIFO/块文件/字符文件,则把文件的打开和后继I/O设置 为非阻塞模式

O_CREAT  若欲打开的文件不存在则自动建立该文件。

O_EXCL   如果O_CREAT也被设置,此指令会去检查文件是否存在。文件若不存在则建立该文件,否则将导致打开文件错误。此外,若O_CREATO_EXCL同时设置,并且欲打开的文件为符号连接,则会打开文件失败。

O_NOCTTY 如果欲打开的文件为终端机设备时,则不会将该终端机当成进程控制终端机。

O_TRUNC 若文件存在并且以可写的方式打开时,此标志位会令文件长度清为0,而原来存于该文件的资料也会消失。

O_APPEND 当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面。

O_NONBLOCK以不可阻断的方式打开文件,也就是无论有无数据读取或等待,都会立即返回进程之中。

O_NDELAYO_NONBLOCK

O_SYNC以同步的方式打开文件。

O_NOFOLLOW如果参数pathname所指的文件为一符号连接,则会令打开文件失败。

O_DIRECTORY如果参数pathname所指的文件并非为一目录,则会令打开文件失败。

 

1.Read

定义函数

ssize_t read (int fd,   void *buf,   size_t  count);

返回值

成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0

参数

参数fd是文件描述符。

参数count是请求读取的字节数,

读上来的数据保存在缓冲区buf中,

同时文件的当前读写位置向后移。注意这个读写位置和使用C标准I/O库时的读写位置有可能不同,这个读写位置是记在内核中的,而使用C标准I/O库时的读写位置是用户空间I/O缓冲区中的位置。

read函数返回时,返回值说明了buf中前多少个字节是刚读上来的。有些情况下,实际读到的字节数(返回值)会小于请求读的字节数count,例如:读常规文件时,在读到count个字节之前已到达文件末尾。例如,距文件末尾还有30个字节而请求读100个字节,则read返回30,下次read将返回0

2.Write

write函数所在的头文件为 <unistd.h>

ssize_t  write (int handle,  void *buf,  int  nbyte);

handle 是文件描述符;

buf    是指定的缓冲区,即指针,指向一段内存单元;

nbyte  是要写入文件指定的字节数;返回值:返回写入文档的字节数(成功);返回-1(出    错)

Write  函数把bufnbyte写入文件描述符handle所指的文档,成功时返回写的字节数,错误时返回-1.

3.lseek

头文件#include <sys/types.h>

 #include <unistd.h>

 off_t   lseek (int  handle,  off_t  offset,  int  fromwhere);

参数fildes 为已打开的文件描述符,参数offset 为根据参数whence来移动读写位置的位移数。

whence为下列其中一种:SEEK_SET,SEEK_CURSEEK_END和依次为012.

SEEK_SET 将读写位置指向文件头后再增加offset个位移量。

SEEK_CUR 以目前的读写位置往后增加offset个位移量。

SEEK_END 将读写位置指向文件尾后再增加offset个位移量。

whence 值为SEEK_CUR SEEK_END时,参数offet允许负值的出现。

 

每个打开的文件都有一个与其相关连的“当前文件偏移量”( current file offset )。它通常是一个非负整数,用以度量从文件开始处计算的字节数。通常,读、写操作都从当前文件偏移量开始,并使偏移量增加所读写的字节数。按系统默认情况,当打开一个文件时,除非指定 O_APPEND 选项,否则该偏移量设置为 0

lseek调用仅将当前的文件偏移量记录在内核中,它并不引起任何的 I/O 操作。然后,该偏移量用于下一个读或写操作。

4.lstat()

 #include <sys/stat.h>

函数名: lstat

 : 获取一些文件相关的信息

 : int  lstat (const char *path ,  struct stat *buf);

参数:

path:文件路径名。

buf:是以下结构体的指针

struct stat {

dev_t st_dev; /* 文件所在设备的标识 */

ino_t st_ino; /* 文件结点号 */

mode_t st_mode; /* 文件保护模式 */

nlink_t st_nlink; /* 硬连接数 */

uid_t st_uid; /* 文件用户标识 */

gid_t st_gid; /* 文件用户组标识 */

dev_t st_rdev; /* 文件所表示的特殊设备文件的设备标识 */

off_t st_size; /* 总大小,字节为单位 */

blksize_t st_blksize; /* 文件系统的块大小 */

blkcnt_t st_blocks; /* 分配给文件的块的数量,512字节为单元 */

time_t st_atime; /* 最后访问时间 */

time_t st_mtime; /* 最后修改时间 */

time_t st_ctime; /* 最后状态改变时间 */

};

返回说明编辑

成功执行时,返回0。失败返回-1errno被设为以下的某个值

EBADF: 文件描述词无效

EFAULT: 地址空间不可访问

ELOOP: 遍历路径时遇到太多的符号连接

ENAMETOOLONG:文件路径名太长

ENOENT:路径名的部分组件不存在,或路径名是空字串

ENOMEM:内存不足

ENOTDIR:路径名的部分组件不是目录

 

6.dup2()

#include<unistd.h>

Int dup2(int  old_fd ,int  new_fd);

功能:

复制一个现有的文件描述符。

如果new_fd已经打开,则先将其关闭,若new_fd = old_fd,dup2返回new_fd而不将其关闭。否则,new_fdFD_CLOSEEXEC文件描述符标志就被清除,调用exec时是打开状态。

7.creat

#include<fcntl.h>

int creat(const char *filename, mode_t mode)

filename要创建的文件名(包含路径,缺省为当前路径)

mode创建模式

常见创建模式:(也可以用数字代替以下宏)

S_IRUSR   可读                   ->1

S_IWUSR 可写  ->2

S_IXUSR 可执行 ->4

S_IRWXU 可读、可写、可执行  ->7

无任何权限     ->0

创建成功则返回一个文件描述符,否则返回一个小于0的数

eg:

fd=creat(file,777);

8.access

#include <stdio.h>
#include <unistd.h>

int access(const char * pathname,int mode)

功能:

判断文件可以操作的权限

pathname:需要检测的文件路劲名

mode:需要测试的权限模式

R_OK  可读

W_OK 可写

X_OK 可执行

    返回值:

测试成功,满足操作权限返回0,否则返回-1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值