《UNIX环境高级编程》读书笔记之文件IO(1)

1.文件描述符

       对于内核而言,所有打开的文件都是通过文件描述符应用的。使用open或create返回的文件描述符标示该文件,使用read或者write时需要使用将文件描述符作为参数传入。

       UNIX系统将文件描述符0与进程的标准输入关联,文件描述符1与进程的标准输出关联,文件描述符2与进程的标准错误关联。为了提高程序的可读性,应该把0,1,2替换成符号常STDIN_FILENO,STDOUT_FILENO,STDERR_FILENO 。这些常量在<unistd.h>中定义的。


2.打开文件

      调用open或openat函数可以打开或创建一个文件。

       #include <fcntl.h>//这两个函数的声明在fcntl.h中

       int open(const char *path,int oflag,.../* mode_t mode*/);

       int openat(int fd,const char *path,int oflag,.../* mode_t mode*/);

       path参数是要打开或创建文件的名字。oflag是由以下一个或多个常量 进行“或”运算构成的。

       O_RDONLY  只读打开

       O_WRONLY  只写打开

       O_RDWR 读写打开

       O_EXEC 只执行打开

       O_SEARCH 只搜索打开

       这5个常量中必须制定一个且只能指定一个。下列常量可选:

       O_APPEND 追加到尾端

       O_CLOEXEC 把FD_CLOEXEC常量设置为文件描述符标志。

       O_CREAT文件不存在则创建

       O_DIRECTORY 如果path引用不是目录 则出错

       .........(详见书本51页)

   

      fd参数把open和openat区分开。有下列三种情况:

   (1)path参数制定的是绝对路径名。在这种情况下,fd被忽略,两函数等价。

   (2)path参数指定的是相对路径名,fd参数指定了相对路径名在文件中的开始地址。

   (3)path参数指定了相对路径名,fd参数具有特殊值AT_FDCWD,在这种情况下,开始地址就是当前路径。


3.函数lseek

   每个打开文件都有一个“当前文件偏移量”。打开一个文件,除非已O_APPEND的模式打开,文件的偏移量都为0。

   函数原型:

   #include <unistd.h>

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

   文件的偏移量由offset与whence共同决定:

 (1)若whence是SEEK_SET。则将该文件的偏移量设置为距文件开始处offset个字节处。

 (2)若whence是SEEK_CUR。则将该文件的偏移量设置为当前偏移量加offset个字节处,offse可正可负。

 (3)若whence是SEEK_END。则将该文件的偏移量设置为文件长度加offset个字节处,offse可正可负。

   特别注意,lseek函数不能作用于管道,FIFO或网络套接字。


4.函数read 

  调用read函数从文件中读数据

 #include <unistd.h>

  ssize_t read(int fd,void *buf,size_t nbytes);(返回值代表实际读出数据的字节数,有可能会小于nbytes)


5.函数write

   调用write函数向文件中写数据。

   #include <unistd.h>

   ssize_t write(int fd,const void *buf,size_t nbytes);(返回值代表实际读出数据的字节数,有可能会小于nbytes)


6.函数fcntl

  函数fcntl可以改变已经打开文件的属性

  #include <fcntl.h>

  int fcntl(int fd,int cmd,.../*int arg*/);

  函数有以下五种功能:
   (1)复制一个已有的描述符(cmd=F_DUPFD或F_DUPFD_CLOEXEC)。
   (2)获取/设置文件描述符标志(cmd=F_GETFD或F_SETFD)。
   (3)获取/设置文件描述符标志(cmd=F_GETFL或F_SETFL,如是已读的模式打开,还是以写的模式打开)。
   (4)获取/设置异步IO所有权(cmd=F_GETOWN时返回又有fd的进程ID,cmd=F_SETOWN时,将fd的进程ID设置为arg)。
   (5)获取/设置记录锁(cmd=F_GETLK,F_SETLK,F_SETLKW)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值