一、 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”