深入理解计算机系统--系统级I/O

一.相关知识点
1.文件
  • 在Linux中,一切皆文件
  • 文件类型有:- 普通文件、 d 目录文件、 l 链接文件
2.文件的创建和打开
  • 已存在的文件:直接打开
  • 不存在的文件:则先创建
(1)创建文件:int creat(char *name,mode_t perms);
  • 创建新文件时,应指定文件名和访问权限,系统返回一个非负整数,它被称为文件描述符,用fd表示。
  • 文件描述符用于标识被创建的文件,在之后对文件的读写等操作时用文件描述符代表文件。
(2)打开文件:int open(char *name,int flags,mode_t perms);
  • 标准输入(fd=0)、标准输出(fd=1)、标准出错(fd=2)三种文件自动打开,其他文件须用creat或open函数显示创建或打开后才能读写。
  • 参数flags:O_RDONLY,O_WRONLY|O_APPEND,O_RDWR等。
3.关闭文件:int close(int fd)
  • 文件打开后,完成其他操作后就要关闭文件。
4.读写文件
(1)读文件(从文件到内存):ssize_t read(int fd,void *buf,size_t n);
  • fd:文件标识符,指从哪个文件中读取数据。
  • buf:指向一段内存空间,表示数据读到哪里去。
  • n:数量,表示读多少个字节。
(2)写文件(从内存到文件):ssize_t write(int fd,void *buf,size_t n);
  • fd:文件标识符,表示要写到哪个文件中去。
  • buf:指向一段内存空间。指向要写的数据的首地址。
  • n:要写多少字节。
二.关于ls -l命令
1.命令解析
  • ls -l 命令:执行此命令可查看一个目录下的文件和子目录的详悉信息,其会得到一个详细的文件和目录名列表.这个列表包含了文件的属性,所属用户,所属组,创建时间,文件大小等等信息。
2.执行结果

在这里插入图片描述

关于drwxrwxrwx的解释:
  • 第一位字母表示文件类型。-表示普通文件,d表示目录文件,l表示链接文件。
  • 第二、三、四位字母表示文件的访问权限。r表示读,w表示写,x表示执行。
  • 第五、六、七位字母表示文件在同一组的用户所具有的权限。
  • 第八、九、十位字母表示其他用户所具有的权限。
三.一些代码的执行
1.ffiles1

(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;
}

(2)在Linux环境下的运行结果
在这里插入图片描述

2.ffiles2

(1)源代码

#include "csapp.h"
int main(int argc, char *argv[])
{
    int fd1;
    int s = getpid() & 0x1;
    char c1, c2;
    char *fname = argv[1];
    fd1 = Open(fname, O_RDONLY, 0);
    Read(fd1, &c1, 1);
    if (fork()) {
 /* Parent */
    sleep(s);
    Read(fd1, &c2, 1);
    printf("Parent: c1 = %c, c2 = %c\n", c1, c2);
    } else {
 /* Child */
    sleep(1-s);
    Read(fd1, &c2, 1);
    printf("Child: c1 = %c, c2 = %c\n", c1, c2);
    }
    return 0;
}

(2)在Linux环境下的运行结果

在这里插入图片描述

3.ffiles3

(1)源代码

#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;
}

(2)在Linux环境下运行的结果

在这里插入图片描述

此文章参考《深入理解计算机系统》一书及袁春风老师的网课而写,不是很完整,之后再有更多的点再加上去,如有写得不好的地方请多指教!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值