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

news2024/11/14 20:14:30

05 / Linux系统IO函数 

 (1)man 2 open

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

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

参数:

            pathname:要打开文件路径

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

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

返回值:

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

查看返回值

 (2)man 3 perror

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

void perror(const char *s);

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

open.c

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

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

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

#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);//fd 文件描述符
    if(fd == -1){
        perror("open");
    }
    // 读写操作

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

create.c

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

    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 <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main() {

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

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

    // 关闭
    close(fd);

    return 0;
}

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

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

 copyfile.c

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

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

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 <stdio.h>
int fseek(FILE *stream, long offset, int whence);

Linux系统函数
#include <sys/types.h>
#include <unistd.h>
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 <stdio.h>
    int fseek(FILE *stream, long offset, int whence);

    Linux系统函数
    #include <sys/types.h>
    #include <unistd.h>
    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 <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

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 结构体

 

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

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 <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>

    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 <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>

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;
}

创建软链接

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/758939.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

#systemverilog# 关于关键字 之 event 了解这些够了(二)->和 ->> 区别

在上一篇文章,我们学习了event 的相关语法和举例,清晰的说明了具体场合的使用规则。今天,我们着重看一下 -> 和 ->> 的区别,进而在以后的工作过程种,能为大家带来一些便利。 我们先看 -> : 【-> 正确的用法】: 【-> 不正确的用法】: 可以看出,触…

BaseDexClassLoader加载类流程源码阅读

安卓10 类图 双亲委派机制 Java层 BaseDexClassLoader 没有loadClass实现&#xff0c;继承的是 ClassLoader 实现 路径 libcore\ojluni\src\main\java\java\lang\ClassLoader.java protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFound…

【Linux】- 任务调度和定时任务

任务调度和定时任务 1 crond 任务调度2 at 定时任务 1 crond 任务调度 crontab 进行 定时任务的设置 任务调度&#xff1a;是指系统在某个时间执行的特定的命令或程序。 任务调度分类&#xff1a;1.系统工作&#xff1a;有些重要的工作必须周而复始地执行。如病毒扫描等 个别…

.Net Framework下面如何生成AOT呢?

前言 有人问&#xff0c;老版本的.net frameworker能不能生成AOT?其实AOT预编译&#xff0c;在.Net FrameWorker1.0里面就有了。它叫做Ngen&#xff0c;只不过当时叫做生成本机映像&#xff0c;实际上还是一个东西&#xff0c;也就是预编译。本篇来看下。原文&#xff1a;.Net…

MySQL数据库多表查询

目录 一、创建表单 二、操作 1.查询student表的所有记录 2.查询student表的第2条到4条记录 3.从student表查询所有学生的学号&#xff08;id&#xff09;、姓名&#xff08;name&#xff09;和院系&#xff08;department&#xff09;的信息 4.从student表中查询计算机系和…

电子表格错误分析 ExcelAnalyzer Platinum v3.4.4 Crack

ExcelAnalyzer是世界上最强大的 Excel 插件&#xff0c;用于检查和更正电子表格。做出更好的决策&#xff0c;并 100% 确信您的电子表格没有错误。 相信您的电子表格数据 只需点击几下即可纠正电子表格错误 易于使用且透明 安全又安全 研究表明&#xff0c;95% 的电子表格包含错…

初识Visual Basic编辑器并建立一段简单的代码(上)

【分享成果&#xff0c;随喜正能量】不要把自己的伤口揭开给别人看&#xff0c;世上多的不是医师&#xff0c;多的是撒盐的人。。 《VBA之Excel应用》&#xff08;10178983&#xff09;是非常经典的&#xff0c;是我推出的第七套教程&#xff0c;定位于初级&#xff0c;目前是…

微服务系列文章 之 nginx日志格式分析以及修改

如何自定义日志格式&#xff0c;就需要修改nginx日志打印格式 一. 打开终端&#xff0c;登录服务器并输入服务器密码 //ssh 用户名服务器ip ssh root192.168.0.132二. 切换到nginx目录 cd /var/log/nginx/ 三. 查看nginx日志 tail -f access.log 日志说明&#xff1a; //…

OpenCV for Python 入坑第二天 :图片处理(1)

上一篇博客我们简单了解了一下如何打开图片、保存图片、创建窗口等等。那么今天我们就来尝试一下完成OpenCV基础操作——图像的处理 文章目录 什么是图像处理图像的展示方法灰度图像介绍彩色图像介绍 图像的像素修改OpenCV的图像存储方式NumPy创建图像彩色图片存储 小结 什么是…

用WinDBG调试DMP文件

把对应工程的pdb文件&#xff0c;放到C盘下的一个文件夹&#xff0c;例如 C:\mysymbols 打开WinDBG&#xff0c;选择File -> Symbol File Path , 输入C:\mysymbols\;SRV*C:\symbols*http://msdl.microsoft.com/download/symbols&#xff0c;然后OK &#xff08;这可以使W…

微服务系列文章 之 Nginx状态监控日志分析详解

1、Nginx状态监控 Nginx提供了一个内置的状态信息监控页面可用于监控Nginx的整体访问情况&#xff0c;这个功能由ngx_http_stub_status_module模块进行实现。 使用nginx -V 2>&1 | grep -o with-http_stub_status_module命令检测当前Nginx是否有status功能&#xff0c…

德哥说库-MySQL数据类型

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&#x1f61…

【Mac使用笔记】之 Homebrew

Homebrew更新&#xff1a; brew update && brew upgrade 当出现错误&#xff1a; fatal: couldnt find remote ref refs/heads/master 执行&#xff1a; brew tap --repair Ruby安装&#xff1a; 1、查看当前Homebrew版本&#xff1a; brew --version2、查看当前…

在Console无图形界面程序使用SetTimer

UpdateData(true);将控件的值赋值给成员变量 UpdateData(false);将成员变量的值赋值给控件 UpdateData;用来刷新当前对话框 也就是说:当你使用了ClassWizard建立了控件和变量之间的联系后&#xff1a;当你修改了变量的值&#xff0c;而希望对话框控件更新显示&#xff0c;就应该…

Android手写占位式插件化框架之apk解析原理系统源码分析

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 前言&#xff1a; 上一篇文章 Android手写占位式插件化框架之Activity通信、Service通…

服务器与客户端数据交换(Rest API)

服务器端 Rest API 输出普通对象 AjaxResponse jsonObj AjaxResponse.success(body);log.info("{} json:{}",RestResponseBodyAdvice.class,jsonObj.toString());return jsonObj;AjaxResponse(successtrue, code200, messageThis is normal, contentUserVO(id1, …

模拟实现strcpy

隔了一段时间没有更新博客了&#xff0c;今天给大家带来的是&#xff1a;如何用C语言模拟实现 strcpy 函数 赶时间的朋友建议直接复制走代码&#xff0c;我会在下面详细剖析代码 引言 在计算机编程中&#xff0c;字符串处理是一个非常重要的部分。strcpy函数是C语言中用于复制…

16 | 视图:如何实现服务和数据在微服务各层的协作?

目录 服务的协作 1. 服务的类型 2. 服务的调用 微服务内跨层 微服务之间的服务调用 领域事件驱动 3. 服务的封装与组合 基础层 领域层 应用层 用户接口层 4. 两种分层架构的服务依赖关系 松散分层架构的服务依赖 严格分层架构的服务依赖 数据对象视图 基础层 领…

electron-updater 报错 Cannot find module ‘debug‘

使用 electron-updater 更新 electron 应用&#xff0c;打完包安装启动出现这种报错&#xff1a;Cannot find module debug&#xff0c;Cannot find module builder-util-runtime。 项目依赖 {"electron": "^24.4.1","electron-builder": "…

【机器学习】了解 AUC - ROC 曲线

一、说明 在机器学习中&#xff0c;性能测量是一项基本任务。因此&#xff0c;当涉及到分类问题时&#xff0c;我们可以依靠AUC - ROC曲线。当我们需要检查或可视化多类分类问题的性能时&#xff0c;我们使用AUC&#xff08;曲线下面积&#xff09;ROC&#xff08;接收器工作特…