本篇内容介绍了“Linux操作文件系统怎么调用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
需要引入的头文件:
#inlcude<unistd.h>
打开一个已存在的文件
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
返回值:文件描述符
ssize_t read(int fd, void *buf, size_t count);
参数介绍
fd:对应打开的文件描述符buf : 存放数据的空间count: 计划一次从文件中读多少字节数据返回值: 实际读到的字节数
ssize_t write(int fd, const void *buf, size_t count);
参数介绍:
fd :对应打开的文件描述符buf:存放待写入的数据count:计划一次向文件中写入多少数据
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操作文件系统怎么调用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。