Linux之操作文件的系统调用
程序员文章站
2022-03-06 08:05:20
目录1.打开文件参数介绍2. 读文件3. 写文件4.关闭分析题练习题系统调用和库函数的区别需要引入的头文件:#inlcude1.打开文件打开一个已存在的文件int op...
需要引入的头文件:
#inlcude<unistd.h>
1.打开文件
打开一个已存在的文件
int open(const char *pathname, int flags);
新建一个文件并创建权限
int open(const char *pathname, int flags, mode_t mode);
参数介绍
pathname:将要打开的文件路径和名称
flags:打开标志
标志介绍:
the argument flags must include one of the following access modes: o_rdonly, o_wronly, or o_rdwr. these request opening the file read- only, write-only, or read/write, respectively.
o_rdonly 只读打开
o_rdwr 读写打开
o_creat 文件不存在则创建
o_append 文件末尾追加
o_trunc 清空文件,重新写入 mode
the following symbolic constants are provided for mode: s_irwxu 00700 user (file owner) has read, write, and execute permission s_irusr 00400 user has read permission s_iwusr 00200 user has write permission s_ixusr 00100 user has execute permission s_irwxg 00070 group has read, write, and execute permission s_irgrp 00040 group has read permission s_iwgrp 00020 group has write permission s_ixgrp 00010 group has execute permission s_irwxo 00007 others have read, write, and execute permission s_iroth 00004 others have read permission s_iwoth 00002 others have write permission s_ixoth 00001 others have execute permission
返回值:文件描述符
2. 读文件
ssize_t read(int fd, void *buf, size_t count);
参数介绍
fd:对应打开的文件描述符buf : 存放数据的空间count: 计划一次从文件中读多少字节数据返回值: 实际读到的字节数
3. 写文件
ssize_t write(int fd, const void *buf, size_t count);
参数介绍:
fd :对应打开的文件描述符buf:存放待写入的数据count:计划一次向文件中写入多少数据
4.关闭
int close(int fd);
fd :对应的文件描述符
分析题
如果父进程先打开一个文件,fork 后子进程是否可以共享使用?
文件内容
代码
#include<stdio.h> #include<unistd.h> #include<assert.h> #include<fcntl.h> #include<stdlib.h> int main() { char buff[128] = {0}; int fd = open("myfile.txt", o_rdonly); pid_t pid = fork(); assert(pid != -1); if (pid == 0) { read(fd, buff, 1); printf("child buff = %s\n", buff); sleep(1); read(fd, buff, 1); printf("child buff = %s\n", buff); } else { read(fd, buff, 1); printf("parent buff = %s\n", buff); sleep(1); read(fd, buff, 1); printf("parent buff = %s\n", buff); } close(fd); exit(0); }
运行结果:
结论:
由于 fork 创建的子进程的 pcb 是拷贝父进程的,子进程的 pcb 中的文件表指向打开文件的指针只是拷贝了父进程 pcb 中的值,所以父子进程共享父进程 fork 之前打开的所有文件描述符。
练习题
完成对一个文件的复制(类似命令:cp)
原文件内容为:
代码:
#include<stdio.h> #include<unistd.h> #include<fcntl.h> #include<stdlib.h> #include<assert.h> int main(void) { char buff[128] = {0}; int fdr = open("myfile.txt", o_rdonly); assert(fdr != -1); int fdw = open("newfile.txt", o_wronly | o_creat, 0600); assert(fdw != -1); int n = 0; while (n = read(fdr, buff, 128) > 0) { write(fdw, buff, n); } close(fdr); close(fdw); exit(0); }
运行示例:
可以看到newfile.txt创建成功
系统调用和库函数的区别
区别: 系统调用的实现在内核中,属于内核空间,库函数的实现在函数库中,属于用户空间。
系统调用执行过程:
到此这篇关于linux之操作文件的系统调用的文章就介绍到这了,更多相关linux文件系统调用内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
上一篇: linux中的软连接和硬连接详解