real :总耗时 = 用户态时间 + 内核态时间 + 等待时间
sys 内核态时间
user 用户态时间
系统调用的过程
文件
文件系统
数据结构 文件在磁盘上的储存形式
算法 访问磁盘文件中数据的方法
UFS Unix File System
磁盘驱动器 :分区(逻辑区)
目录文件中保存的就是其中每个文件及子目录的名字(字符串)和i节点号(整数)对应表,其中每一个条目就叫一个硬链接。
2.文件类型:保存在每个文件的i节点的元数据中,以及该文件的目录条目中。
1.普通文件(-):文档、代码、可执行程序、脚本、音视频、配置信息等;
2.目录文件(d):其内容包含其下所有条目的硬链接(. 当前目录;… 上级目录);
3.符号链接文件(l):其内容是另一文件的路径;
/abc/def -> 18000
硬链接(ln)
/ghi/jkl -> 18000
/mno/opr -> 19000 -> 内容:/abc/def - 符号链接(ln -s)
4.字符设备文件 (c)以字节为单位顺序读写如键盘、串口;
5.块设备文件(b)以若干字节组成的数据块为单位读写,如硬盘、打印机;
6.管道文件§:SVR4引入的进程间通信对象;
7.本地套接字文件(s):BSD引入的进程间通信对象。
系统函数
1.文件的打开与关闭
#include<fcntl.h>
int open(char const* pathname ,int flags,mode_t mode);
成功返回文件路径,失败返回-1。
pathname :文件路径名;
flags:状态标志
- O_RDONLY 只读
- O_WRONLY 只写
- O_RWDR 读写
- O_APPEND 追加
- O_CREAT 不存在即创建,已存在即打开
- O_EXCL 不存在即创建,已存在即报错
- O_TRUNC 不存在即创建,已存在即清空
mode :对新创建的文件设置权限 :0UGO,其中每一位均有4、2和1的组合,分别表示读写执行权限
0644
0751
文件打开
/*
date 2020-07-18
name 文件打开关闭操作
version 1.0
*/
#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
int main(void) {
int fd1 = open("open.txt",O_RDWR | O_CREAT | O_TRUNC,0666);
if(fd1 == 1) {
perror("open");
return -1;
}
printf("fd1:%d\n",fd1);
int fd2 = open("open.txt",O_RDONLY);
if(fd2 == -1) {
perror("open");
return -1;
}
printf("fd2:%d\n",fd2);
colse(fd1);
colse(fd2);
return 0;
}
- 每个进程一经启动就会默认打开三个文件:标准输入(键盘设备)、标准输出(终端设备)和标准错误(终端窗口),分别占用文件描述符0、1和2。
- 文件描述符是一个小整数,每次使用最小的空闲项,作为文件新增条目文件的实际权限除了与mode参数有关还与调用进程的umask属性有关:
实际权限 = mode & ~umask = 0666 & 0222 = 0664
FILE* fp = fopen(“open.txt,O_RDONLY”);
…
colse(fd);
#include<stdio.h>
typedef struct _IO_FILE FILE;
#include<stdio.h>
struct _IO_FILE {
…
int _fileno; //文件描述符
…
};
shell的I/O重定向
./redir 0<i.txt 1>o.txt 2>e.txt
/*
date 2020-07-18
name I/O重定向 redir.c
versin 1.0
*/
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<unistd.h>
//增加
void redir(void) {
//close (0);
close(STDIN_FILENO);
open("i.txt",ORDONLY);
//close(1);
close(STDOUT_FILENO);
open("o.txt",O_WRONLY | O_CREAT | O_TRUNC,0644);
//close(2);
close(STDERR_FILENO);
open("e.txt",O_WRONLY | O_CREAT | O_TRUNC,0644);
}
void doio(void) {
int x,y;
scanf("%d%d",&x,&y);
printf("%d+%d=%d",x,y,x+y);
malloc(0xFFFFFFFFFFFFFFFFFFFFFFFF);
perror(malloc);
}
int main(void) {
redir();
doio();
return 0;
}