自学笔记,没有历史知识铺垫(省略百度部分)C语言笔记-14-资源操作-底层文件操作
fcntl.h
文件是计算机的一种资源,进程访问资源时会做记录。记录在进程的PCB(process control block)中。
进程每访问一次资源,都会创建一个struck file结构体进行记录,并将该结构体的地址存放在PCB中的成员数组(0、1、2已经被占用)中最小未使用的下标(首次打开一个资源,地址将会存放在3中)中,此时下标3便是文件描述符。当关闭该资源时,PCB中,3下标内容会被释放,允许重复使用。
注意:PCB中成员数组下标固定含义
0:标准输入STDIN_FILENO1:标注输出STDOUT_FILENO2:标注错误输出STDERR_FILENO
open(const char *path,int flag,...)
打开文件
| 参数 | 描述 |
|---|---|
| pathname | 文件名 |
| flags | 文件创建标记 [按位或 文件身份标识] |
| mode | 权限掩码(mode & ~umask) (flags为O_CREAT时,必须提供) |
文件创建标记
- O_RDONLY 只读
- O_WRONLY 只写
- O_RDWR 读写
文件身份标识
- O_CREAT 创建模式打开(文件读写位置在开头)
- O_APPEND 追加模式打开(文件读写位置在末尾)
- O_EXCL
- O_NONBLOCK
- …
mode
S_IRUSR 00400 |owner has read permission
S_IWUSR 00200| owner has write permission
S_IXUSR 00100 |owner has execute permission
S_IRGRP 00040 |group has read permission
S_IWGRP 00020 |group has write permission
S_IXGRP 00010 |group has execute permission
S_IROTH 00004 |others have read permission
S_IWOTH 00002| others have write permission
S_IXOTH 00001| others have execute permission
umask
$ umask
0002 // 10进制
10进制转为二进制数字文件权限
--- --- -w-
000 000 010
权限掩码
mode & ~umask表示110 110 110按位与(按位取反000 000 010)
110 110 110
111 111 101
即:
110 110 100
rw- rw- r--
close(int id)
移除程序PCB,指定资源的引用计数
文件读写
ssize_t read(int fd,void *buf,size_t count)
从fd(文件描述符)文件中读取count个字节到buf中
返回实际读取的字节数 0表示达到文件末尾
write(int fd,void *buf,size_t count)
将count个字节写buf中,并写入fd中(fd=1时,表示控制台,PCB的标准输出位置)
unistd.h
实现文件描述符的复制(场景:数据流的重定向)
int dup(int oldfd)
返回最小未使用的文件描述符
int dup2(int oldfd,int newfd)
返回newfd为指定描述符,并关闭newfd原来的描述符
#include
#include
#include int main(int argc, char *argv[])
{char *msg = "this is msg\n";int fd = open(argv[1], O_WRONLY | O_CREAT, 0644);int temp = dup(1);dup2(fd, 1);close(fd);write(1, msg, strlen(msg));dup2(temp, 1);write(1, msg, strlen(msg));close(temp);return 0;
}
# 测试
dony15$ gcc -o ac.out main.c
dony15$ ./ac.out test
this is msg
dony15$ cat test
this is msg
本章主要为C语言笔记-14-资源操作-底层文件操作