牛客Linux高并发服务器开发学习第五天

文件I/O

站在文件和内存的角度,输入输出的定义不同。

我们应该站在内存的角度去看文件的输入输出。

标准C库IO函数

与Linux系统的IO函数是对应关系。

先写到缓冲区,缓冲区满了,写到磁盘里,提高执行效率。 

虚拟地址空间

解决程序加载内存的一些问题。

可执行程序运行起来就会有一个虚拟地址空间,运行结束了就没有这个空间了。

用户区:

内核区:没有读写权限,需要API系统调用。

文件描述符

文件描述符存在于进程的内核区。

内核空间受保护,用户不能对该空间进行读写操作,否则会出现错误。

内核区包含内存管理,进程管理,设备驱动管理,VFS虚拟文件系统。

在内存管理模块里面有PCB(进程控制块),是一个非常复杂的结构体,其中有一个数组叫文件描述符表,大小为1024,可同时打开的文件最多就为1024个,每打开一个文件占用一个文件描述符,而且是空闲的最小的一个文件描述符。

一个文件可以被打开多次,每一次的文件描述符是不一样的。

Linux系统IO函数

open函数

       int open(const char *pathname, int flags);

       int open(const char *pathname, int flags, mode_t mode);

可以打开一个文件,也可以创建一个文件,根据flags标志位信息的不同,功能也不同。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdio.h>
#include<unistd.h>
int main()
{
        int fd = open("a.txt",O_RDONLY); 
        if(fd==-1)
        {
            perror("open");
        }
        //关闭
        close(fd);//#include<unistd.h>

        return 0;
}

flags标志位的定义包含在前两个头文件里。

open函数包含在fcntl.h头文件里,

perror函数包含在unistd.h头文件里,

close函数包含在stdio.h头文件里。

参数:

            - pathname:要创建文件的路径

            - flag: 对文件的操作权限和其他的设置

                - 必选项:O_RDONLY,O_WRONLY,O_RDWR 这三个之间是互斥的

                - 可选项:O_CREAT 文件不存在,创建新文件

            - mode: 八进制的数,表示创建出的新的文件的操作权限,如0775

            The effective mode is modified by the process's umask  in the  usual  way:  in  the absence of a default ACL, the mode of the

            created file is (mode & ~umask).

            (mode & ~umask) umask为0002

            0777 ->111111111

        &   0775   111111101

----------------------------------

            0775   111111101

因此umask的作用就是抹去一些权限,当前用户不能控制其他用户的权限。

不同当前用户的umask不同,root的和当前用户的不同。

flags参数是一个int类型,4字节,32位。

flags 32位,每个位是一个标志位。

read、write函数

man 2 read/write

可以查看read/write函数说明

示例:写一个copyfile文件,将一个文本的内容,复制到一个新的文本中,其中包含读取文件、创建新文件,读文件,写文件,关闭文件等操作。

/*
       #include <unistd.h>
       ssize_t read(int fd, void *buf, size_t count);


*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include<stdio.h>

int main()
{
    //通过open打开english.txt文件
    int srcfd = open("english.txt",O_RDONLY);
    if(srcfd == -1)
    {
        perror("open");
        return -1;
    }
    //创建一个新的文件(拷贝文件)
    int destfd = open("cpy.txt",O_WRONLY | O_CREAT, 0664);
    if(destfd == -1)
    {
        perror("open");
        return -1;
    }
    //频繁的读写操作
    char buf[1024] = {0};
    int len = 0;
    while(len = read(srcfd,buf,sizeof(buf)))
    {
        write(destfd,buf,len);
    }
    close(destfd);
    close(srcfd);



    return 0;
}

学习进度:

Linux系统编程入门 05:52:14

  • 14
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值