Linux 系统调用的本质

news2024/11/16 0:03:31

简单概念

  1. fd
    在这里插入图片描述
#include <unistd.h>
#include <string.h>

int main(int argc,char* argv[])
{
    char buf[20]={0};
    read(0,buf,15);
    write(1,buf,strlen(buf));

    return 0;
}
  1. 如果想查看某个系统编程的接口,比如想查看 open 函数的用法,可以这样操作:man 2 open。可以看到open函数在哪里定义的,以及open函数的使用方法。
  2. 首先看一个简单的demo1
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main(int argc,char* argv[])
{
    int fd=0;
    fd=open("hello.txt",O_RDWR|O_CREAT,0666);
    if(fd == -1)
    {
        printf("open file failed!\n");
        return -1;
    }
    char string[128]="Hello Word!\n";
    write(fd,string,strlen(string));
    fsync(fd); //1.为什么要用fsync?因为调用write(...)函数时候,并没有真正写入到磁盘上,可能还在缓冲区中,等缓冲区满了之后,再一起写到磁盘中。
               //2.所以,fsync(...) 是强制让缓冲区中的内容写到磁盘中。
    char* buf=(char*)malloc(20);
    memset(buf,0,20);
    lseek(fd,0,SEEK_SET);   // 1.SEEK_SET : 代表文件开始 SEEK_CUR:文件当前位置 SEEK_END:文件末尾
                            // 2.因为上面调用 write(...)函数,使得文件指针偏移了,现在使用lseek(...)将文件指针还原。
    read(fd,buf,strlen(string));
    printf("%s",buf);

    free(buf);
    close(fd);

    return 0;
}

3.自己动手实现一个cp 命令

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

#define BUFFERSIZE 4096

int main(int argc,char* argv[])
{
    if(argc != 3)
    {
        printf("usage:\n copy src dst\n");
        return 1;
    }

    int srcfd = open(argv[1],O_RDONLY);
    if(srcfd == -1)
    {
        perror("open");
        return 1;
    }
    int dstfd = open(argv[2],O_CREAT|O_WRONLY,0666);
    if(dstfd == -1)
    {
        perror("open");
        return 1;
    }

    int len=0;
    char buffer[BUFFERSIZE] = {0};
    while((len=read(srcfd,buffer,BUFFERSIZE)) > 0)
    {
        if(write(dstfd,buffer,len) != len)
        {
            perror("error");
            return 2;
        }
    }
    if(len<0)
    {
        perror("read error");
        return 3;
    }
    close(srcfd);
    close(dstfd);

    return 0;
}

系统调用与C标准库函数

  1. 一般来说C语言中很多函数 fopen、fclose、fseek、fread、fwrite等待都是对Linux 系统调用的封装。
    在这里插入图片描述
    在这里插入图片描述
    一般来说,Linux各种系统的调用流程如上图所示。

  2. 首先用户空间调用 read 函数,通过中断机制,进入到内核空间,内核空间有一个虚拟文件系统(VFS),虚拟文件系统(VFS)是对内核中各种各样的设备的抽象。

  3. 我们知道Linux中一切皆文件,对每个设备都抽象成一个文件。每个文件的 读/写 又是不一样的,因此需要一个公用的VFS虚拟文件系统对内核的文件进行抽象。

系统调用的基本流程:

  1. 软中断:X86下init0X80;ARM架构下SWI软中断指令
  2. 寄存器保存相关参数:参数、系统调用号
  3. 进入内核态,执行内核特权指令代码函数
  4. 返回值保存到寄存器
  5. 返回到用户态、系统调用结束

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

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

相关文章

Python调用C++代码用法——Linux

目录 前言 C/C动态共享库编译 ctype模块 ctype数据类型 使用案例 float数据 指针 结构体及结构体指针 numpy图像当作指针传入 参考资料&#xff1a; 前言 在项目开发中&#xff0c;有时会使用到多种编程语言&#xff0c;比如部分功能是C/C代码实现的&#xff0c;而另一…

《机器学习与应用》实验二:BP神经网络实验

文章目录 一、实验目的二、实验原理BP算法的数学描述三、程序四、实验结论一、实验目的 1、 熟悉MATLAB中神经网络工具箱的使用方法; 2、 通过在MATLAB下面编程实现BP网络逼近标准正弦函数,来加深对BP网络的了解和认识,理解信号的正向传播和误差的反向传递过程。 二、实验…

SAP MM物料与客户主数据的税分类

一&#xff0e;说明 在物料主数据、客户主数据中均有税分类的维护&#xff0c;税分类既不是税码也不代表税率&#xff0c;它们的作用是通过税务条件记录确定税码。所有的税分类在主数据中都是与国家相关的无组织机构数据&#xff0c;例如物料的销售组织有中国&#xff08;ZH&am…

智慧WMS立体仓库管理系统源码 基于springboot框架(已经测试完整带部署搭建教程)源码分享!

淘源码&#xff1a;国内知名的高品质源码免费下载平台 分享一套智慧WMS立体仓库管理系统源码&#xff0c;基于springboot框架 已经测试完整带部署搭建教程。&#xff08;MF00767&#xff09; 需要源码学习可私信我获取。 技术架构 技术框架&#xff1a;SpringBoot layui H…

ESLint插件的使用

官网地址 规范写代码的工具. 多人开发不同规则,提交代码一堆冲突 培养代码风格使用 vscode更改tab缩进空格数----设置—搜索tabsize—找到tab size—修改2(每次按下tab都缩进俩空格)—Vetur > Format Options: Tab Size这个也要修改为2 vscode搜索format----勾选Editor: Fo…

javaweb01--mysql的介绍和增删改查操作

文章目录Mysql的介绍和增删改查说明1. mysql的登陆和退出11 登陆1.2 退出2. SQL语法的简单介绍2.1 语法2.2 SQL分类3. SQL主要操作语句3.1 DDL:操作数据库3.1.1 查询3.1.2 创建数据库3.1.3 删除数据库3.1.4 使用数据库3.2 DDL:操作表3.2.1 查询表3.2.2 创建表3.2.3 数据类型3.2…

《梁启超家书》笔记二——一个人若是在舒服的环境中会消磨志气,那么在困苦懊丧的环境中也一定会消磨志气

目录 一、做事的态度 二、学习与未来 三、发挥其个性之特长&#xff0c;以靖献于社会 四、鼓励相信孩子 五、犯错 六、身体健康 七、做事 八、与费用相关 九、在困苦中求快活 十、让孩子自由决策与建议 十一、处事态度&#xff1a;不要悲观 十二、时事分析 一、做事…

在IDEA中获取文件绝对路径(通用方式)

package com.javase.reflect;/*** 关于文件路径问题* 以前我们都是在IDEA中&#xff0c;依据IDEA默认的当前路径&#xff1a;project的根来获取文件&#xff0c;但是这种方法有它的局限性&#xff0c;那就是当代码离开了IDEA* 换到了其他位置&#xff0c;我们就找不到文…

基于 Tensorflow 2.x 使用 MobileNetV2 微调模型优化训练花卉图像识别模型

一、模型微调 上篇文章我们通过搭建三层卷积模型&#xff0c;训练了花卉图像识别模型&#xff0c;最后经验证集验证后准确率大约为 75% &#xff0c;本篇文章对该数据集进行优化&#xff0c;提高识别的准确度。本篇文章中对于数据集的读取强化不做过多的介绍了&#xff0c;大家…

免拆机,Kindle固件版本5.10.3~5.13.3如何越狱?简单、易操作版

前言 之前有出过Kindle的越狱教程&#xff1a; 无需拆机&#xff0c;Kindle 全系列 5.12.2.2 ~ 5.14.2版本如何越狱&#xff1f;如何安装第三方插件 确实可以越狱&#xff0c;使用的漏洞也是&#xff1a; KindleDrip — From Your Kindle’s Email Address to Using Your C…

ubuntu18.04下mysql数据库C语言API封装

mysql C语言API操作数据库比较繁琐&#xff0c;可以将其封装起来&#xff0c;这样使用比较方便&#xff0c;下面是一种封装方式。 目录 1.连接封装 2.连接池封装 3.测试代码 1.连接封装 将数据库连接进行封装&#xff0c;主要提供如下接口&#xff1a; &#xff08;1&…

L2-030 冰岛人

2018年世界杯&#xff0c;冰岛队因1:1平了强大的阿根廷队而一战成名。好事者发现冰岛人的名字后面似乎都有个“松”&#xff08;son&#xff09;&#xff0c;于是有网友科普如下&#xff1a; 冰岛人沿用的是维京人古老的父系姓制&#xff0c;孩子的姓等于父亲的名加后缀&#x…

torchnet.meter使用教程

前言 最近项目开发过程中遇到了torchnet.metertorchnet.metertorchnet.meter来记录模型信息&#xff0c;搜了好多篇博客潦潦草草&#xff0c;没有一点干货&#xff0c;于是根据官方代码和官方文档&#xff0c;基于自己的理解&#xff0c;制定了使用教程: torchnet简介 torch…

一句话实现报表生成PDF同时通过outlook发送

元旦节快乐 哈喽&#xff0c;大家2023年好呀&#xff01; 今天&#xff0c;元旦最后一天&#xff0c;给大家分享什么好玩的示例呢&#xff1f; 让我来想想&#xff0c;嗯&#xff1f;这样可以吗&#xff1f;一句话就实现将报表生成PDF&#xff0c;同时可以编辑一些信息并通过…

【源码分享】java多用户B2B2C商城源码带WAP手机端源码

分享一款非常不错的java多用户B2B2C商城源码&#xff0c;带WAP手机端源码&#xff0c;源码地址在文末。 需要源码学习&#xff0c;可私信我获取。 一、技术构架&#xff1a; 开发语言&#xff1a; Java1.7 数 据 库 &#xff1a; MySQL5.5 数据库持久层&#xff1a;阿里巴巴…

车载诊断协议UDS——会话模式状态机Session

UDS之Session服务 会话模式管控是汽车电子诊断范畴很重要的两个状态机之一(另一个是安全访问),不同的会话模式是用来区分诊断服务执行权限。 一位非常尊敬的业内前辈曾举如下例子来形容这个状态机:不同的场景,喝对应的酒! 公司商务场合下,对应的酒是红酒;长辈酒桌上,对…

Redis 哨兵模式

哨兵是一个分布式系统&#xff0c;你可以在一个架构中运行多个哨兵进程&#xff0c;这些进程使用流言协议来接收关于Master主服务器是否下线的信息&#xff0c;并使用投票协议来决定是否执行自动故障迁移&#xff0c;以及选择哪个Slave作为新的Master。 一、哨兵模式概述 1.1…

ubuntu做系统常见出错处理方法1

1.不能分区解决办法&#xff08;安装ubuntu没有出现安装选项&#xff0c;也就是找不到硬盘分区怎么办?-爱码网&#xff09; 解决办法是进入bios模式(一般都是重启时反复按f12&#xff0c;不同电脑型号可自行查阅)把硬盘模式从raid调整为ahci(System configuration–&#xff…

方差和标准差的意义

文章目录案例&#xff1a;箭靶案例&#xff1a;身高案例&#xff1a;身高体重在此前一篇文章 《算法效果评估&#xff1a;均方根误差&#xff08;RMSE&#xff09;/ 标准误差》中&#xff0c;我们介绍了方差/标准差的计算方法&#xff0c;也点出了它们是用来“度量数据离散程度…

linux系统中wifi驱动的配置与编译实现方法

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何使用linux系统中的WIFI驱动完成相应的实验。 目录 第一&#xff1a;WIFI驱动添加与编译方法 第二&#xff1a;将驱动代码添加到linux内核中 第三&#xff1a;配置Linux内核 第四&#xff1a;编译WIFI驱动 第一&…