Linux之操作文件的系统调用

 更新时间:2021年12月07日 11:17:57   作者:Sauron7i  
大家好,本篇文章主要讲的是Linux之操作文件的系统调用,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览

需要引入的头文件:

#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下的Make命令

    实例详解Linux下的Make命令

    众所周知在Linux系统下的make 命令是系统管理员和程序员用的最频繁的命令之一。管理员用它通过命令行来编译和安装很多开源的工具,程序员用它来管理他们大型复杂的项目编译问题。下面这篇文章我们将用一些实例来讨论make命令背后的工作机制。有需要的朋友们可以看看。
    2016-12-12
  • Ubuntu16.04配置lamp环境的具体方法

    Ubuntu16.04配置lamp环境的具体方法

    下面小编就为大家带来一篇Ubuntu16.04配置lamp环境的具体方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • 解决vim语法高亮不起作用的方法

    解决vim语法高亮不起作用的方法

    这篇文章主要给大家介绍了如何解决vim语法高亮不起作用的方法,文章给大家介绍了多种解决的方法,大家可以根据需要看看是哪个方面的问题,希望能对遇到这个问题的朋友们有所帮助,下面来一起看看吧。
    2016-10-10
  • Linux下几种并发服务器的实现模式(详解)

    Linux下几种并发服务器的实现模式(详解)

    下面小编就为大家分享一篇Linux下几种并发服务器的实现模式详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • Linux下如何查杀stopped进程详解

    Linux下如何查杀stopped进程详解

    这篇文章主要给大家介绍了关于Linux下如何查杀stopped进程的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用linux系统具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • Linux 下sftp配置之密钥方式登录详解

    Linux 下sftp配置之密钥方式登录详解

    这篇文章主要介绍了Linux 下sftp配置之密钥方式登录详解的相关资料,为了安全性,需使用sftp,锁定目录且不允许sftp用户登到服务器,需要的朋友可以参考下
    2016-12-12
  • Ubuntu 18.04上安装Apache、MySQL、PHP、LAMP的完整教程

    Ubuntu 18.04上安装Apache、MySQL、PHP、LAMP的完整教程

    这篇文章主要介绍了Ubuntu 18.04上安装Apache, MySQL, PHP, LAMP的完整教程,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • linux下的yum命令原理和详解

    linux下的yum命令原理和详解

    本文主要介绍linux下的yum命令原理和详解,讲解的比较全面,需要的朋友可以参考一下。
    2016-06-06
  • ubuntu14.04 使用中遇到的问题及解决方法集锦

    ubuntu14.04 使用中遇到的问题及解决方法集锦

    这篇文章主要介绍了ubuntu14.04 使用中遇到的问题及解决方法集锦,需要的朋友可以参考下
    2014-10-10
  • linux下安装nodejs及npm的方法

    linux下安装nodejs及npm的方法

    本篇文章主要介绍了linux下安装nodejs及npm的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06

最新评论