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

简介: 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023年清洁电器行业数据分析:洗地机市场规模持续倍增,进入赛点

洗地机作为清洁电器领域的明星品类&#xff0c;正在成为继扫地机器人之后拉动清洁电器市场大盘的又一核心动力。 在清洁电器领域&#xff0c;扫地机器人、洗地机和吸尘器是三大热门品类。截至今年9月份&#xff0c;根据鲸参谋平台的数据显示&#xff0c;吸尘器的规模继续大幅下…

2023年香水行业数据分析:国人用香需求升级,高端香水高速增长

在人口结构变迁的背景下&#xff0c;“Z世代”作为当下我国的消费主力&#xff0c;正在将“悦己”消费推动成为新潮流。具备经济基础的“Z世代”倡导“高颜值”、“个性化”、“精致主义”&#xff0c;这和香水、香氛为代表的“嗅觉经济”的特性充分契合&#xff0c;因此&#…

初始Redis 分布式结构的发展演变

目录 Redis的特点和使用场景 分布式系统的引入 单机系统 分布式系统 应用服务器的增多&#xff08;处理更多的请求&#xff09; 数据库读写分离&#xff08;数据服务器的增多) 引入缓存 应对更大的数据量 业务拆分&#xff1a;微服务 Redis的特点和使用场景 我们先来…

vue重修之Vuex【下部】

文章目录 版权声明Vuex的模块化获取Vuex模块内state数据获取Vuex模块内getters数据获取Vuex模块内mutations方法获取模块内的actions方法总结 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明&#xff0c;所有版权属于黑马程序员或相关权利…

浮动面试题

浮动元素特点&#xff1a;

B-3:Web安全之综合渗透测试

B-3:Web安全之综合渗透测试 任务环境说明: 服务器场景:Server2104(关闭链接) 服务器场景用户名、密码:未知 1.通过URL访问http://靶机IP/1,对该页面进行渗透测试,将完成后返回的结果内容作为FLAG值提交; 通过访问IP/1,查看源代码发现flagishere,访问后发现什么也没…

Kafka - 异步/同步发送API

文章目录 异步发送普通异步发送异步发送流程Code 带回调函数的异步发送带回调函数的异步发送流程Code 同步发送API 异步发送 普通异步发送 需求&#xff1a;创建Kafka生产者&#xff0c;采用异步的方式发送到Kafka broker 异步发送流程 Code <!-- https://mvnrepository…

【STM32】HAL库ADC多通道精准测量(采用VREFINT内部参考电压)

【STM32】HAL库ADC多通道精准测量&#xff08;采用VREFINT内部参考电压&#xff09; 文章目录 多通道测量VREFINTADC采样周期多通道配置 附录&#xff1a;Cortex-M架构的SysTick系统定时器精准延时和MCU位带操作SysTick系统定时器精准延时延时函数阻塞延时非阻塞延时 位带操作…

热点不热!如何修复笔记本电脑未连接到移动热点的问题

当你远离常规Wi-Fi时,移动热点是让你的笔记本电脑上网的关键,但当它没有按计划运行时,你会怎么办?以下是Windows笔记本电脑无法连接到移动热点时的几种修复方法。 为什么我的笔记本电脑没有连接到我的热点 由于你的笔记本电脑正试图连接到另一个有限制和可能存在问题的设…

docker在java项目中打成tar包

docker在java项目中打成tar包 1、首先安装一个docker desktop 2、mvn install项目后&#xff0c;建立一个自己的dockerfile 这里我以我的代码举例&#xff0c;from 镜像&#xff0c;这里你也能打包好一个镜像的基础上&#xff0c;from打好的镜像&#xff0c;这里我们用openj…

黑豹程序员-架构师学习路线图-百科:API接口测试工具Postman

文章目录 1、为什么要使用Postman&#xff1f;2、什么是Postman&#xff1f; 1、为什么要使用Postman&#xff1f; 目前我们开发项目大都是前后端分离项目&#xff0c;前端采用h5cssjsvue基于nodejs&#xff0c;后端采用java、SpringBoot、SSM&#xff0c;大型项目采用SpringC…

Fiddler抓包VSCode和探索

前言&#xff1a; 最近在使用 VSCode 调试 web 程序时&#xff0c;遇到一些问题&#xff0c;当时不知道如何是好。所以决定抓看来看一看&#xff0c;然后一顿操作猛如虎&#xff0c;成功安装了抓包软件 – Fiddler Classic。我并没有使用 Postman 这种重量级的 HTTP 测试软件&a…

JavaScript-2-菜鸟教程

字符串 可以使用 索引 位置访问字符串中的每个字符 可以使用内置属性 length 来计算字符串的长度 var txt "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; var sln txt.length;<script>var x "John"; // x是一个字符串// 使用 new 关键字将字符…

APP破解去广告

1.修改图标和名称 名称直接改 找到图标在进去把他替换掉 2.修改app包名实现分身 修改包名实现app分身_Tian翊的博客-CSDN博客 3.修改资源去广告 安卓逆向006之修改APK资源去广告_修改安装包去除app内广告-CSDN博客 打开模拟器后在cmd命令行输入adb devices连接上 在模拟器中…

【Java 进阶篇】Java Request 原理详解

在网络应用开发中&#xff0c;HTTP请求是一项常见而关键的任务。当我们使用Java编写网络应用时&#xff0c;了解HTTP请求的工作原理变得至关重要。本文将详细介绍Java中HTTP请求的原理&#xff0c;包括请求的结构、发送请求的方法以及处理请求的过程。 HTTP请求的基本结构 HT…

薛定谔的猫重出江湖?法国初创公司AliceBob研发猫态量子比特

总部位于巴黎的初创公司Alice&Bob使用超导芯片的两个相反的量子态&#xff08;他们称之为“猫态量子比特”芯片&#xff09;来帮助开发量子计算的不同自旋方式。&#xff08;图片来源&#xff1a;网络&#xff09; 有的人认为&#xff0c;构建量子计算机的模块模仿了著名的…

用友U8SMSProxy -SQL注入漏洞

0x01 漏洞介绍 用友GRP-U8 R10政务管理软件是由用友政务公司基于云技术所推出的第十代政务产品。这款产品继承了用友R9、R9i、U8等行政事业版产品的各项优点&#xff0c;并融合了全国广大用户的最佳实践应用。它旨在为政府财政部门、社保部门、卫生部门、教育部门、民政部门、党…

代码随想录打卡第五十天|198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

198.打家劫舍 题目&#xff1a; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 …

hibernate源码(1)--- schema创建

sessionFactory 配置项&#xff1a; hibernate的核心是sessionFactory&#xff0c;那我们看看如何构建session Factory。 参考官网&#xff1a; plugins {id("java") } group "com.atai.hibernatespy" version "1.0-SNAPSHOT" repositories…

如何在《阴阳师》游戏中使用单机单窗口软件工具进行防封技巧?

如何在《阴阳师》游戏中使用单机单窗口软件工具进行防封技巧&#xff1f; 首先&#xff0c;定义在《阴阳师》游戏中&#xff0c;使用单机单窗口软件工具进行防封技巧涉及到如何安装和配置软件&#xff0c;以及如何在游戏中应用这些技巧。 我曾经使用过在《阴阳师》游戏中防封…