基于linux下的高并发服务器开发(第一章)- Linux系统IO函数

05 / Linux系统IO函数 

基于linux下的高并发服务器开发(第一章)- Linux系统IO函数_第1张图片

 (1)man 2 open

>>打开一个已经存在的文件

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

参数:

            pathname:要打开文件路径

            - flags:对文件的操作权限设置还有其他的设置

            O_RDONLY,O_WRONLY,O_RDWR 这三个设置是互斥的

返回值:

            返回一个新的文件描述符,如果调用失败,返回-1

基于linux下的高并发服务器开发(第一章)- Linux系统IO函数_第2张图片

查看返回值

基于linux下的高并发服务器开发(第一章)- Linux系统IO函数_第3张图片

 (2)man 3 perror

作用:打印errono对应的错误描述

void perror(const char *s);

        s参数:用户描述,比如hello,最终输出的内容是 hello:xxx(实际的错误描述)

基于linux下的高并发服务器开发(第一章)- Linux系统IO函数_第4张图片

open.c

/*
    #include 
    #include 
    #include 

    //打开一个已经存在的文件
    int open(const char *pathname, int flags);
        参数:
            pathname:要打开文件路径
            - flags:对文件的操作权限设置还有其他的设置
            O_RDONLY,O_WRONLY,O_RDWR 这三个设置是互斥的
        返回值:
            返回一个新的文件描述符,如果调用失败,返回-1
    
    errno:属于Linux系统函数库,库里面的一个全局变量,记录的是最近的错误号
    
    #include 
    void perror(const char *s);
        s参数:用户描述,比如hello,最终输出的内容是 hello:xxx(实际的错误描述)
    作用:打印errono对应的错误描述

    //创建一个新的文件
    int open(const char *pathname, int flags, mode_t mode);
*/

#include 
#include 
#include 
#include 
#include 

int main(){
    // 打开一个文件
    int fd = open("a.txt",O_RDONLY);//fd 文件描述符
    if(fd == -1){
        perror("open");
    }
    // 读写操作

    // 关闭
    close(fd);
    return 0;
}

create.c

/*
    #include 
    #include 
    #include 

    int open(const char *pathname, int flags, mode_t mode);
        参数:
            - pathname:要创建的文件的路径
            - flags:对文件的操作权限和其他的设置
                - 必选项:O_RDONLY,  O_WRONLY, O_RDWR  这三个之间是互斥的
                - 可选项:O_CREAT 文件不存在,创建新文件
            - mode:八进制的数,表示创建出的新的文件的操作权限,比如:0775
            最终的权限是:mode & ~umask
            0777   ->   111111111
        &   0775   ->   111111101
        ----------------------------
                        111111101
        按位与:0和任何数都为0
        umask的作用就是抹去某些权限。

        flags参数是一个int类型的数据,占4个字节,32位。
        flags 32个位,每一位就是一个标志位。

*/
#include 
#include 
#include 
#include 
#include 

int main() {

    // 创建一个新的文件
    int fd = open("create.txt", O_RDWR | O_CREAT, 0777);

    if(fd == -1) {
        perror("open");
    }

    // 关闭
    close(fd);

    return 0;
}

#include
ssize_t read(int fd, void *buf, size_t count);
    参数:
        - fd:文件描述符,open得到的,通过这个文件描述符操作某个文件
        - buf:需要读取数据存放的地方,数组的地址(传出参数)
        - count:指定的数组的大小
    返回值:
        - 成功:
            >0: 返回实际的读取到的字节数
            =0:文件已经读取完了
        - 失败:-1 ,并且设置errno

#include
ssize_t write(int fd, const void *buf, size_t count);
    参数:
        - fd:文件描述符,open得到的,通过这个文件描述符操作某个文件
        - buf:要往磁盘写入的数据,数据
        - count:要写的数据的实际的大小
    返回值:
        成功:实际写入的字节数
        失败:返回-1,并设置errno

 copyfile.c

/*  
    #include 
    ssize_t read(int fd, void *buf, size_t count);
        参数:
            - fd:文件描述符,open得到的,通过这个文件描述符操作某个文件
            - buf:需要读取数据存放的地方,数组的地址(传出参数)
            - count:指定的数组的大小
        返回值:
            - 成功:
                >0: 返回实际的读取到的字节数
                =0:文件已经读取完了
            - 失败:-1 ,并且设置errno

    #include 
    ssize_t write(int fd, const void *buf, size_t count);
        参数:
            - fd:文件描述符,open得到的,通过这个文件描述符操作某个文件
            - buf:要往磁盘写入的数据,数据
            - count:要写的数据的实际的大小
        返回值:
            成功:实际写入的字节数
            失败:返回-1,并设置errno
*/
#include 
#include 
#include 
#include 
#include 

int main() {

    // 1.通过open打开english.txt文件
    int srcfd = open("english.txt", O_RDONLY);
    if(srcfd == -1) {
        perror("open");
        return -1;
    }

    // 2.创建一个新的文件(拷贝文件)
    int destfd = open("cpy.txt", O_WRONLY | O_CREAT, 0664);
    if(destfd == -1) {
        perror("open");
        return -1;
    }

    // 3.频繁的读写操作
    char buf[1024] = {0};
    int len = 0;
    while((len = read(srcfd, buf, sizeof(buf))) > 0) {
        write(destfd, buf, len);
    }

    // 4.关闭文件
    close(destfd);
    close(srcfd);


    return 0;
}

lseek.c

标准C库的函数
#include
int fseek(FILE *stream, long offset, int whence);

Linux系统函数
#include
#include
off_t lseek(int fd, off_t offset, int whence);
    参数:
        - fd:文件描述符,通过open得到的 通过这个fd操作某个文件
        - offset:偏移量
        - whence:
            SEEK_SET
                设置文件指针的偏移量
            SEEK_CUR
                设置偏移量:当前位置 + 第二个参数offset的值
            SEEK_END
                设置偏移量:文件大小 + 第二个参数offset的值
    返回值:返回文件指针的位置


作用:
    1.移动文件指针到文件头
    lseek(fd, 0, SEEK_SET);

    2.获取当前文件指针的位置
    lseek(fd, 0, SEEK_CUR);

    3.获取文件长度
    lseek(fd, 0, SEEK_END);

    4.拓展文件的长度,当前文件10b, 110b, 增加了100个字节
    lseek(fd, 100, SEEK_END)
    注意:需要写一次数据

/*  
    标准C库的函数
    #include 
    int fseek(FILE *stream, long offset, int whence);

    Linux系统函数
    #include 
    #include 
    off_t lseek(int fd, off_t offset, int whence);
        参数:
            - fd:文件描述符,通过open得到的 通过这个fd操作某个文件
            - offset:偏移量
            - whence:
                SEEK_SET
                    设置文件指针的偏移量
                SEEK_CUR
                    设置偏移量:当前位置 + 第二个参数offset的值
                SEEK_END
                    设置偏移量:文件大小 + 第二个参数offset的值
        返回值:返回文件指针的位置


    作用:
        1.移动文件指针到文件头
        lseek(fd, 0, SEEK_SET);

        2.获取当前文件指针的位置
        lseek(fd, 0, SEEK_CUR);

        3.获取文件长度
        lseek(fd, 0, SEEK_END);

        4.拓展文件的长度,当前文件10b, 110b, 增加了100个字节
        lseek(fd, 100, SEEK_END)
        注意:需要写一次数据

*/

#include 
#include 
#include 
#include 
#include 

int main() {

    int fd = open("hello.txt", O_RDWR);

    if(fd == -1) {
        perror("open");
        return -1;
    }

    // 扩展文件的长度
    int ret = lseek(fd, 100, SEEK_END);
    if(ret == -1) {
        perror("lseek");
        return -1;
    }

    // 写入一个空数据
    write(fd, " ", 1);

    // 关闭文件
    close(fd);

    return 0;
}

06 / stat 结构体

基于linux下的高并发服务器开发(第一章)- Linux系统IO函数_第5张图片

基于linux下的高并发服务器开发(第一章)- Linux系统IO函数_第6张图片

 基于linux下的高并发服务器开发(第一章)- Linux系统IO函数_第7张图片

#include
#include
#include

int stat(const char *pathname, struct stat *statbuf);
    作用:获取一个文件相关的一些信息
    参数:
        - pathname:操作的文件的路径
        - statbuf:结构体变量,传出参数,用于保存获取到的文件的信息
    返回值:
        成功:返回0
        失败:返回-1 设置errno

int lstat(const char *pathname, struct stat *statbuf);
    参数:
        - pathname:操作的文件的路径
        - statbuf:结构体变量,传出参数,用于保存获取到的文件的信息
    返回值:
        成功:返回0
        失败:返回-1 设置errno

stat.c

/*
    #include 
    #include 
    #include 

    int stat(const char *pathname, struct stat *statbuf);
        作用:获取一个文件相关的一些信息
        参数:
            - pathname:操作的文件的路径
            - statbuf:结构体变量,传出参数,用于保存获取到的文件的信息
        返回值:
            成功:返回0
            失败:返回-1 设置errno

    int lstat(const char *pathname, struct stat *statbuf);
        参数:
            - pathname:操作的文件的路径
            - statbuf:结构体变量,传出参数,用于保存获取到的文件的信息
        返回值:
            成功:返回0
            失败:返回-1 设置errno

*/

#include 
#include 
#include 
#include 

int main() {

    struct stat statbuf;

    int ret = stat("a.txt", &statbuf);

    if(ret == -1) {
        perror("stat");
        return -1;
    }

    printf("size: %ld\n", statbuf.st_size);


    return 0;
}

基于linux下的高并发服务器开发(第一章)- Linux系统IO函数_第8张图片

创建软链接

基于linux下的高并发服务器开发(第一章)- Linux系统IO函数_第9张图片

基于linux下的高并发服务器开发(第一章)- Linux系统IO函数_第10张图片

 

 

你可能感兴趣的:(linux,运维,服务器)