一.相关知识点
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环境下运行的结果