CSAPP——chap10 I/O

一、 Linux 下 ls 命令

ls命令是Linux中最常用的命令之一。ls是list的缩写。
用来打印当前目录清单或者打印出指定目录下的文件及文件清单。ls命令在打印文件清单时,还可以查看文件权限、目录信息等等。
可以使用帮助命令查看详细命令参数:man ls或ls --help。

举例 ls -l

在这里插入图片描述
在这里插入图片描述
解释:
第1列
第1个字母
d:目录(文件夹)
-(减号):普通文件
l(小写l字符):链接文件
后面的9个字符
表示文件的权限。r:可读 w:可写 x:可执行 -:没有对应权限
第2-4个字符表示文件的拥有者(当前用户)的权限,第5-7个字符是组用户的权限,第8-10个字符是对其他用户访问文件的权限。
第2列 有多少链接指向这个文件。
第3列 谁是这个文件/文件夹的所有者。
第4列 谁是这个文件/文件夹的所有组。
第5列 这个文件/文件夹的以字节为单位的大小。
第6列 文件最后的修改时间。
第7列 文件名或者目录名。
(参考于:https://blog.csdn.net/micjlxx/article/details/84889322 )

二、系统级I/O

1. 打开和关闭文件
/*打开*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(char *filename, int flags, mode_t mode);
//返回:若成功则为新文件描述符,若出错为-1

/*关闭*/
#include <unistd.h>

int close(int fd);
//返回:若成功则为0,若出错则为-1
`

不存在的文件先创建再打开,已存在的文件直接打开。
一个应用程序通过要求内核打开相应的文件,来宣告它想访问一个I/O设备,内核返回一个小的非负整数,叫做==(文件)描述符==,即fd
Linux shell 创建的每个进程开始时都有三个打开的文件:标准输入文件(键盘),描述符为0,标准输出文件(显示器),描述符为1,标准错误,描述符为2。头文件 <unistd.h> 定义了常量 STDIN_FILENO 、STDOUT-FILENO 和 STDERR_FILENO 用于对应表示以上三个文件。
涉及很多 flags 参数,如 O_CREAT :如果文件不存在,就创建;O_TURNC :如果文件已经存在,就截断;O_APPEND:在每次写操作之前,设置文件位置到文件的结尾处。

2. 读和写文件
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t n);//返回:若成功则为读的字节数,若EOF(什么都没读到)则为0,若出错为-1
//fd:文件描述符 *buf:指向一段内存空间,表示从哪里开始读 n:读的字节数
ssize_t write(int fd, const void *buf, size_t n);//返回:若成功则为写的字节数,若出错则为-1
//fd:文件描述符 *buf:指向一段内存空间,表示从哪里开始写 n:写的字节数

读文件:从指定文件到内存。写文件:从内存到指定文件。

3. lseek 、 stat

三、 I/O重定向

#include <unistd .h>
int dup2(int oldfd, int newfd);
// 若成功则为非负的描述符,若出错则为-1

dup2 函数复制描述符表项 oldfd 到描述符表项 newfd ,覆盖描述符表项 newfd 以前的内容。如果 newfd 已经打开了,dup2 会在复制 oldfd 之前关闭 newfd 。

#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);//fd3 被关闭,所有操作被重定向到 fd2
    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;
}

在这里插入图片描述

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

在这里插入图片描述
(cat指令用于显示文件中的内容)
可以看到 abcde.txt 的内容由“abcde”变为了“pqrswxyznef”
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值