第十章相关 系统级i/o

1.打开和关闭文件

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(char *filename, int flags, mode_t mode);

open()函数将filename转换为一个文件描述符,并且返回描述符数字

filename:一个文件路径

  • O_RDONLY:只读
  • O_WRONLY:只写
  • O_RDWR:可读可写
  • O_CREAT: 文件不存在,就创建一个它的截断的文件。
  • O_TRUNC: 如果文件已经存在,就截断它。
  • O_APPEND:每次写操作,都在文件结尾处添加
  • O_NONBLOCK:非阻塞方式打开文件。如果文件没内容,read报错;如果文件没空间,write报错
  • O_TRUNC:如果文件存在,而且打开方式为O_WRONLY或O_RDONLY则会清空文件内容

 2.读和写文件

ssize_t read(int fd,void *buf,size_t n);
ssize_t write(int fd,const void *buf,size_t n);
  • int fd 文件描述,指向某文件
  • void *buf指向一段空间
  • size_ t n表示读n个字节

若成功则为读的字节数,若为EOF则为0,若出错为-1 。

STDIN_FILENO和STDOUT_FILENO为标准输入流(键盘等)和标准输出流(显示器等)。

其中Read(STDIN_FILENO, &c, 1) != 0类似于getchar

3.读取文件元数据

#include <unistd.h>
#include <sys/stat.h>

int stat(const char*filename,struct stat* buf);
int fstat(int fd,struct stat* buf);

*buf 指向的结构体,用来保存文件状态信息

Linux在sys/stat.h中定义了宏来确定st_mode成员的文件类型

  • S_ISREG(m)是否为普通文件
  • S_ISDIR(m)是否为目录文件
  • S_ISSOCK(m)是否为网络套接字

 

详情如图 看注释

代码1

#include "csapp.h"

int main(int argc, char *argv[])
{
    int fd1, fd2, fd3;
    char c1, c2, c3;
    char *fname = argv[1];
    fd1 = Open(fname, O_RDONLY, 0);
    fd2 = Open(fname, O_RDONLY, 0);
    fd3 = Open(fname, O_RDONLY, 0);
    dup2(fd2, fd3);

    Read(fd1, &c1, 1);
    Read(fd2, &c2, 1);
    Read(fd3, &c3, 1);
    printf("c1 = %c, c2 = %c, c3 = %c\n", c1, c2, c3);

    Close(fd1);
    Close(fd2);
    Close(fd3);
    return 0;
}

认真分析 aab

dup2和dup都可用来复制一个现存的文件描述符,使两个文件描述符指向同一个file结构体。如果两个文件描述符指向同一个file结构体,File Status Flag和读写位置只保存一份在file结构体中,并且file结构体的引用计数是2。如果两次open同一文件得到两个文件描述符,则每个描述符对应一个不同的file结构体,可以有不同的File Status Flag和读写位置。

代码2

#include "csapp.h"

int main(int argc, char *argv[])
{
    int fd1, fd2, fd3;
    char *fname = argv[1];
    fd1 = Open(fname, O_CREAT|O_TRUNC|O_RDWR, S_IRUSR|S_IWUSR);
    Write(fd1, "pqrs", 4);	

    fd3 = Open(fname, O_APPEND|O_WRONLY, 0);
    Write(fd3, "jklmn", 5);
    fd2 = dup(fd1);  /* Allocates new descriptor */
    Write(fd2, "wxyz", 4);
    Write(fd3, "ef", 2);

    Close(fd1);
    Close(fd2);
    Close(fd3);
    return 0;
}

pqrswxyzef

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值