C++之Linux syscall实例总结(二百四十六)

news2024/12/25 23:55:05

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:理解Linux的syscall作用和用法。

2.Linux syscall介绍

Linux的系统调用(System Call,简称syscall)是用户态程序与内核态之间进行交互的重要接口。通过系统调用,用户程序可以请求操作系统内核提供的特权功能,例如文件操作、进程管理、网络通信等。

Linux系统中的系统调用通常采用软中断的方式实现。当用户程序需要使用系统调用时,它会通过指令将处理器从用户态切换到内核态,并触发软中断异常。操作系统内核会根据中断号(系统调用号)来确定需要执行的系统调用函数,进行相应的处理,然后返回结果给用户程序。

Linux内核提供了丰富的系统调用接口,以满足用户程序的需求。一些常见的系统调用包括:

  1. 文件系统相关的系统调用:用于进行文件的打开、读写、关闭、重命名、删除等操作,如openreadwritecloserenameunlink等。

  2. 进程管理相关的系统调用:用于创建、执行、等待和终止进程,以及进程间通信,如forkexecwaitexitkillpipe等。

  3. 内存管理相关的系统调用:用于分配和释放内存,以及修改内存保护属性,如brkmmapmunmapmprotect等。

  4. 网络通信相关的系统调用:用于创建和管理网络连接,进行数据的发送和接收,如socketbindlistenacceptconnectsendrecv等。

  5. 时间和时钟相关的系统调用:用于获取当前时间、设置定时器等,如timegettimeofdayclock_gettime等。

  6. 设备和驱动程序相关的系统调用:用于访问硬件设备和驱动程序,如ioctl等。

使用系统调用需要遵循一定的规范和约定,通常包括以下几个步骤:

  1. 选择适当的系统调用:根据程序的需求,选择合适的系统调用来执行所需的操作。

  2. 设置系统调用参数:根据系统调用的要求,设置相应的参数值。系统调用的参数通常是通过寄存器传递的,具体的参数传递方式和数量依赖于架构和具体的系统调用。

  3. 执行系统调用:通过触发软中断或使用特定的指令,将处理器从用户态切换到内核态,并执行相应的系统调用函数。

  4. 处理返回值:系统调用执行完毕后,将结果返回给用户程序。通常,返回值的含义与具体的系统调用有关,返回值可能包含有用的信息或错误码。

3.syscall实例

1. 读取文件(read):

#include <iostream>
#include <unistd.h>
#include <sys/syscall.h>

int main() {
    int fd = 0; // 标准输入文件描述符
    char buffer[100];
    ssize_t num_bytes;

    num_bytes = syscall(SYS_read, fd, buffer, sizeof(buffer));
    if (num_bytes > 0) {
        std::cout << "读取到的内容:" << std::string(buffer, num_bytes) << std::endl;
    } else {
        std::cout << "读取文件失败" << std::endl;
    }

    return 0;
}

2. 写入文件(write):

#include <iostream>
#include <unistd.h>
#include <sys/syscall.h>

int main() {
    int fd = 1; // 标准输出文件描述符
    char buffer[] = "Hello, syscall!";
    ssize_t num_bytes;

    num_bytes = syscall(SYS_write, fd, buffer, sizeof(buffer) - 1);
    if (num_bytes > 0) {
        std::cout << "成功写入 " << num_bytes << " 字节" << std::endl;
    } else {
        std::cout << "写入文件失败" << std::endl;
    }

    return 0;
}

3. 创建目录(mkdir):

#include <iostream>
#include <sys/syscall.h>

int main() {
    const char* path = "my_directory";
    int result;

    result = syscall(SYS_mkdir, path, 0777);
    if (result == 0) {
        std::cout << "成功创建目录:" << path << std::endl;
    } else {
        std::cout << "创建目录失败" << std::endl;
    }

    return 0;
}

4. 修改文件权限(chmod):

#include <iostream>
#include <sys/syscall.h>

int main() {
    const char* path = "file.txt";
    mode_t mode = S_IRUSR | S_IWUSR; // 设置用户读写权限
    int result;

    result = syscall(SYS_chmod, path, mode);
    if (result == 0) {
        std::cout << "成功修改文件权限" << std::endl;
    } else {
        std::cout << "修改文件权限失败" << std::endl;
    }

    return 0;
}

5. 创建软链接(symlink):

#include <iostream>
#include <unistd.h>
#include <sys/syscall.h>

int main() {
    const char* target = "file.txt";
    const char* linkpath = "mylink";
    int result;

    result = syscall(SYS_symlink, target, linkpath);
    if (result == 0) {
        std::cout << "成功创建软链接" << std::endl;
    } else {
        std::cout << "创建软链接失败" << std::endl;
    }

    return 0;
}

6. 删除文件(unlink):

#include <iostream>
#include <unistd.h>
#include <sys/syscall.h>

int main() {
    const char* path = "file.txt";
    int result;

    result = syscall(SYS_unlink, path);
    if (result == 0) {
        std::cout << "成功删除文件:" << path << std::endl;
    } else {
        std::cout << "删除文件失败" << std::endl;
    }

    return 0;
}

7. 获取当前时间戳(time):

#include <iostream>
#include <sys/time.h>
#include <sys/syscall.h>

int main() {
    struct timeval tv;
    int result;

    result = syscall(SYS_time, &tv, NULL);
    if (result == 0) {
        std::cout << "当前时间戳:" << tv.tv_sec << std::endl;
    } else {
        std::cout << "获取时间戳失败" << std::endl;
    }

    return 0;
}

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

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

相关文章

进程和多线程

目录 进程 1. 如何管理进程 2. 进程调度 3. 内存管理 4. 进程间通信 多线程 线程和进程的关系&#xff1a; 线程安全问题 进程 一个正在运行的程序,就是一个 进程,进程是一个重要的 "软件资源",是由操作系统内核负责管理的。每个进程都对应一些资源,在上图中…

【面试经典150 | 栈】简化路径

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;字符串数组模拟栈 其他语言python3 写在最后 Tag 【栈】【字符串】 题目来源 71. 简化路径 题目解读 将 Unix 风格的绝对路径转化成更加简洁的规范路径。字符串中会出现 字母、数字、/、_、. 和 .. 这几种字符&#…

c语言之源码反码和补码

c语言源码反码和补码 c语言之源码反码和补码 c语言源码反码和补码一、源码反码补码的介绍二、源码反码补码例子三、源码反码补码练习 一、源码反码补码的介绍 原码、反码、补码是计算机中对数字的二进制表示方法。 原码&#xff1a;将最高位作为符号位&#xff08;0表示正&…

sipp3.6多方案压测脚本

概述 SIP压测工具sipp&#xff0c;免费&#xff0c;开源&#xff0c;功能足够强大&#xff0c;配置灵活&#xff0c;优点多。 有时候我们需要模拟现网的生产环境来压测&#xff0c;就需要同时有多个sipp脚本运行&#xff0c;并且需要不断的调整呼叫并发。 通过python脚本的子…

一文讲透 “中间层” 思想

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《EffectiveJava》独家解析》专栏作者。 热门文章推荐&…

【打靶】vulhub打靶复现系列3---Chronos

【打靶】vulhub打靶复现系列3---Chronos 一、主机探测 结合之前的方法&#xff08;arp探测、ping检测&#xff09;&#xff0c;因为我们的靶机和攻击机都在第二层&#xff0c;所以打靶时候我们更依赖arp协议 tips&#xff1a;我在运行期间发现&#xff0c;netdiscover窗口没关…

vue中如何给后端过来的数组中每一个对象加一个新的属性和新的对象(不影响后端的原始数据)

方法&#xff1a; 先看后端的原数据 1、给数组中每一个对象加一个新的属性&#xff1a; 输出查看数组list的值&#xff1a; 2、给数组list加入新的对象&#xff1a; 输出结果&#xff1a; 3、总结&#xff1a; 如果是数组中每个对象新增属性就用map遍历每个对象加入新增的属性…

Baichuan2:Open large-scale language models

1.introduction baichuan2基于2.6万亿个token进行训练。 2.pre-training 2.1 pre-training data 数据处理&#xff1a;关注数据频率和质量。数据频率依赖于聚类和去重&#xff0c;构建了一个支持LSH型特征和稠密embedding特征的大规模去重和聚类系统&#xff0c;单个文档、段…

Java基于ssm+vue开发的失物招领小程序

演示视频&#xff1a; 小程序 https://www.bilibili.com/video/BV1sg4y1d75T/?share_sourcecopy_web&vd_source11344bb73ef9b33550b8202d07ae139b 管理员 https://www.bilibili.com/video/BV1UH4y167xe/?share_sourcecopy_web&vd_source11344bb73ef9b33550b8202d07a…

论文阅读 - Hidden messages: mapping nations’ media campaigns

论文链接&#xff1a; https://link.springer.com/content/pdf/10.1007/s10588-023-09382-7.pdf 目录 1 Introduction 2 The influence model 2.1 The influence‑model library 3 Data 4 Methodology 4.1 Constructing observations 4.2 Learning the state‑transiti…

编写虚拟UART驱动程序-框架

一、框架回顾 二、编写UART驱动要做的事 1.注册一个uart_driver 2. 对于每一个port&#xff0c;都会在设备树里面有一个节点 3. 设备树里的节点和platform_driver节点匹配 4. 当platform_dirver的probe函数被调用时&#xff0c;可以获得设备树里的信息&#xff0c;从而把每个串…

AutoConfigurationPackages.Registrar.class源码阅读

类作用 &#xff5b;link ImportBeanDefinitionRegistrar&#xff5d;存储来自导入的基本包配置。 registerBeanDefinitions 作用&#xff1a; 根据导入的有Configuration注解的类给定的注释元数据注册bean定义。由于与&#xff5b;codeConfiguration&#xff5d;相关的生命周…

HarmonyOS开发:NodeJs脚本实现组件化动态切换

前言 上篇文章&#xff0c;我们使用NodeJs脚本完成了HarmonyOS项目的组件化运行&#xff0c;但是由于脚本是基于4.0.0.400版本的DevEco Studio开发的&#xff0c;可能在配置文件的修改上有些许差距&#xff0c;那么遇到这种情况怎么办&#xff0c;一种是再写一套针对性的脚本文…

谁能想到,字节2023校招起薪40w+

大家好&#xff0c;我是老原。 转眼2023也来到了年底&#xff0c;每年的校招季&#xff0c;都是大厂上演抢人大战的时机&#xff0c;公布薪资和“开奖”一样刺激。 就拿互联网新贵—字节跳动来说&#xff0c;按照字节15薪计算白菜第一年的总包都超过40W了&#xff0c;对比去年…

【Linux】VM及WindowsServer安装

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《微信小程序开发实战》。&#x1f3af;&#x1f3a…

电脑怎么共享屏幕?电脑屏幕共享软件分享!

如何控制某人的电脑屏幕&#xff1f; 有时我们可能需要远程控制某人的计算机屏幕&#xff0c;例如&#xff0c;为我们的客户提供远程支持&#xff0c;远程帮助朋友或家人解决计算机问题&#xff0c;或在家中与同事完成团队合作。那么&#xff0c;电脑怎么共享屏幕&#xff…

皮卡丘RCE靶场通关攻略

皮卡丘RCE靶场通关攻略 文章目录 皮卡丘RCE靶场通关攻略RCE(remote command/code execute)概述远程系统命令执行启动环境漏洞练习第一关exec "ping"第二关 exec "eval" RCE(remote command/code execute)概述 RCE漏洞&#xff0c;可以让攻击者直接向后台服…

java--do-while循环

1.do-while循环 2.do-while循环的特点 先执行后判断 3.三种循环的区别小结 1.for循环和while循环(先判断后执行)&#xff1b;do...while(先执行后判断) 2.for循环和while循环的执行流程是一模一样的&#xff0c;功能上无区别&#xff0c;for能做到的while也能做&#xff0c…

0基础学习PyFlink——用户自定义函数之UDAF

大纲 UDAF入参并非表中一行&#xff08;Row&#xff09;的集合计算每个人考了几门课计算每门课有几个人考试计算每个人的平均分计算每课的平均分计算每个人的最高分和最低分 入参是表中一行&#xff08;Row&#xff09;的集合计算每个人的最高分、最低分以及所属的课程计算每课…

rust学习

rust学习 String类型clone和copy结构体的内存分布for循环&#xff08;<font color red>important&#xff01;&#xff09;堆和栈数据结构vector panic模式匹配忽略模式的值绑定 方法和关联函数线程学习1.多线程的风险2.使用spawn创建线程等待子线程结束move 关键字强制…