Linux---C/C++编程:syscall(系统调用)、SYS_gettid在muduo库中的使用以及static_cast

一、概念

系统调用与用户自定义函数相同,属于一个函数,但是系统调用运行在内核态,而用户自定义函数运行在用户态。由于某些指令(如设置时钟、关闭/打开中断和I/O操作等)只能运行在内核态,所以操作系统提供了系统调用这样的机制,使用户能够进入内核态。
实际上,系统调用 是 Linux 内核提供的一段代码(函数),其实现了一些特定的功能,用户可以通过 int 0x80 中断(x86 CPU)或者 syscall 指令(x64 CPU)来调用 系统调用。 内核提供用户空间程序与内核空间进行交互的一套标准接口,这些接口让用户态程序能受限为了保证内核稳定性,而不能让用户空间程序随意更改系统,必须是内核对外开放的且满足权限的程序才能调用相应接口)访问硬件设备,比如申请系统资源,操作设备读写,创建新进程等。用户空间发生请求,内核空间负责执行,这些接口便是用户空间和内核空间共同识别的桥梁。
Syscall(系统调用, system call)就是连接用户态和内核态的桥梁。这样即提高了内核的安全型,也便于移植,只需实现同一套接口即可。Linux系统,用户空间通过向内核空间发出Syscall,产生软中断,从而让程序陷入内核态,执行相应的操作。对于每个系统调用都会有一个对应的系统调用号,比很多操作系统要少很多。

二、实战

在linux下每一个进程都一个进程id,类型pid_t,可以由 getpid()获取。
POSIX(可移植操作系统接口)线程也有线程id,类型pthread_t,可以由 pthread_self()获取,线程id由线程库维护。
但是每个进程是独立的,所以会有不同进程中线程号相同的情况。那么若进程p1中的线程pt1要与进程p2中的线程pt2通信,就会存在进程id不重复,而线程id可能重复的状态,所以就需要一个真实的线程id唯一标识,tid。glibc(Linux 下的 C 函数库)没有实现gettid的函数,所以可以通过linux下的系统调用 syscall(SYS_gettid) 来获得。

#include<stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <syscall.h>
pid_t gettid(void) {return (pid_t)syscall(SYS_gettid);
}
int main()
{printf("%d", gettid());
}

muduo库中的使用

t_cachedTid = static_cast<pid_t>(::syscall(SYS_gettid)); 

在muduo库中,我们在CurrentThread中可以看到使用系统调用获取当前线程的tid。

补充一点static_cast

static_cast 是 C++ 中四个命名强制类型转换操作符之一。它用于执行各种不同类型之间的转换。相对于 C 风格的强制转换(如 (int)3.14),static_cast 更加明确和可读;并且 static_cast 只能执行明确允许的转换,有助于避免一些错误。

一般在以下场景中使用:
  • 基础数据类型的转换,例如:double转int
double d = 5.5;
int i = static_cast<int>(d);  // i = 5
  • 指向派生类的指针或引用转换为指向基类的指针或引用
class Base {};
class Derived : public Base {};
Derived derivedObj;
Base* basePtr = static_cast<Base*>(&derivedObj);
  • 指向基类的指针或引用转换为指向派生类的指针或引用,但是不安全,因为在转换过程中没有运行时检查。如果确实需要运行时检查,应使用 dynamic_cast。
Base* basePtr = new Base();
Derived* derivedPtr = static_cast<Derived*>(basePtr); // 不安全!
  • 在有关联的类型之间进行转换
enum Color { RED, GREEN, BLUE };
int value = static_cast<int>(GREEN);  // value = 1
限制
  • 不能用于转换不相关的指针或引用类型。例如,不能将 void* 转换为其他类型的指针,或反之。在这种情况下,应使用 reinterpret_cast。

  • 不能用于移除或添加 const 限定符。在这种情况下,应使用 const_cast。

参考文章链接

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

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

相关文章

c++ libtorch使用cmake建立

如果我们安装好pytorch&#xff0c;其实不一定一定要安装libtorch&#xff0c;默认都已经安装过了 1 进入pytorch conda env list conda activate pytorch 命令行下使用 python -c 来获取libtorch的基本信息&#xff0c; python -c "import torch;print(torch.utils.c…

区块链的可扩展性三难问题

这个词是由以太坊的联合创始人Vitalik Buterin创造的&#xff0c;并提出了理想的区块链需要具备的三个特征&#xff1a;去中心化、可扩展性和安全性。 Vitalik还提出&#xff0c;区块链几乎不可能很好地实现所有这三个特征&#xff0c;所以会出现权衡。 因此&#xff0c;今天…

static静态成员变量和静态方法

当有new创建一个对象的,里面属性和方法,通过构造函数,能定义多个不同的对象,在我们做面向对象开发的时候,给一个场景,人在一个班级的时候,你的老师可能是固定的。 当我们用构造方法去构造的时候&#xff0c;每次都去传递一个固定的实参去定义个老师。 这样好会显得代码非常的…

SOCKET编程(1):基本概念

基本概念 socket分类 socket提供了**流(stream)和数据报(datagram)**两种通信机制&#xff0c;即流socket和数据报socket 流socket基于TCP协议&#xff0c;是一个有序、可靠、双向字节流的通道&#xff0c;传输数据不会丢失、不会重复、顺序也不会错乱 数据报socket基于UDP…

Powerdesigner导入mysql8之后注释丢失

目录 一、问题描述及解决思路 二、导入的步骤 1.先按正常步骤建立一个物理数据模型 &#xff08;1&#xff09;点击“文件-新建模型” &#xff08;2&#xff09;选择物理模型和数据库 2.从sql文件导入表 &#xff08;1&#xff09;点击“数据库-Update Model from Data…

正则表达式-前瞻和后顾

正则表达式中的前瞻和后顾。 前瞻(Lookahead) 前瞻是一种断言,它会检查在当前位置之后是否存在某种模式,但不会实际匹配该模式。前瞻有两种形式: 正向前瞻 (?pattern) 检查当前位置之后是否存在指定的模式如果存在,则匹配成功,但不会消耗该模式例如 \w(?\d) 将匹配后面跟数…

RAG 场景对Milvus Cloud向量数据库的需求

虽然向量数据库成为了检索的重要方式,但随着 RAG 应用的深入以及人们对高质量回答的需求,检索引擎依旧面临着诸多挑战。这里以一个最基础的 RAG 构建流程为例:检索器的组成包括了语料的预处理如切分、数据清洗、embedding 入库等,然后是索引的构建和管理,最后是通过 vecto…

学习笔记:【QC】Android Q : telephony-phone 模块

一、phone init 流程图 高清的流程图参考&#xff1a;【高清图&#xff0c;保存后可以放大看】 二、phone MO 流程图 高清的流程图参考&#xff1a;【高清图&#xff0c;保存后可以放大看】 三、phone MT 流程图 高清的流程图参考&#xff1a;【高清图&#xff0c;保存后可以…

提升工作效率,用ONLYOFFICE打造高效团队协作环境

作为一名深耕技术领域已有六七年的开发者&#xff0c;同时又是断断续续进行技术创作将近六年的一个小小作者&#xff0c;我在工作和日常生活中&#xff0c;使用过各色各样的软件。 而在最近几年&#xff0c;一款名为ONLYOFFICE的开源办公套件逐渐走进并融入我的工作与生活&…

paraview 处理 fluent 计算结果

paraview 处理 fluent 计算结果 参考链接&#xff1a;https://zhuanlan.zhihu.com/p/598032490 希望先生的主页也很有价值&#xff1a;https://www.cnblogs.com/Xiwang-Sun/p/14943429.html

如何在适用于 Linux 的 Visual Studio Code 中使用 .NET 8 上的 FastReport Avalonia

我们将继续撰写有关在各种操作系统上的 Visual Studio Code 中使用 FastReport Avalonia 的系列文章。在本文中&#xff0c;我们将详细分析如何使用 Visual Studio Code IDE 在 Linux 操作系统上运行 FastReport Avalonia。 Avalonia UI 是一个积极用于开发跨平台用户界面的 .…

Hyper-V 管理器安装的ubutun扩容磁盘空间说明

一、删除检查点 首先把这个想要扩容的虚拟机停止掉&#xff0c;然后找到检查点&#xff0c;全删除掉&#xff0c;否则没法编辑这个虚拟磁盘。 二、编辑虚拟磁盘 下面截图中下一步不能点击的&#xff0c;只要删除检查点之后就可以点击了。点击下一步然后选择扩容&#xff0c;然后…

组合模式(结构型)

目录 一、前言 二、透明组合模式 三、安全组合模式 四、总结 一、前言 组合模式(Composite Pattern)是一种结构型设计模式&#xff0c;将对象组合成树形结构以表示“部分-整体”得层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 组合模式由以下角色组成…

SpringSecurity源码分析(RemeberMe)

RememberMeServices RememberMeServices 记住我的服务的接口 可以重写实现自己的记住我 public interface RememberMeServices { //建议 org. springframework. security. authentication. RememberMeAuthenticationToken 在大多数情况下使用它&#xff0c;因为它具有相应的身份…

词袋法TFIDF

Tf-idf⽂本特征提取 TF-IDF的主要思想是&#xff1a;如果某个词或短语在⼀篇⽂章中出现的概率⾼&#xff0c;并且在其他⽂章中很少出现&#xff0c;则认为此词或者短语具有很好的类别区分能⼒&#xff0c;适合⽤来分类。TF-IDF作⽤&#xff1a;⽤以评估⼀字词对于⼀个⽂件集或…

OpenAI 发布 AI 生成图片检测器;Meta 推出 AI 广告创意工具;Google 正式发布 Pixel 8a,主打 AI

OpenAI 发布 AI 生成图片检测器 OpenAI 昨日官宣推出专用的 AI 监测工具&#xff0c;用于监测图片是否由其旗下 AI 图片生成工具 DALL-E 生成&#xff0c;准确率高达 98.8%。 不过该公司表示&#xff0c;这个检测工具并非旨在检测 Midjourney 和 Stability 等其他流行生成器生…

安卓使用Fiddler抓包 2024

简介 最近试了一下安卓使用fiddler 抓包&#xff0c;发现https包基本都会丢失。原因是Anandroid 7版本针对ssl安全性做了加强&#xff0c;不认可用户的证书。我们要做的就是把fiddler导出的证书进过处理后放置到系统证书目录下面&#xff0c;这样才能抓包https请求。 这里使用…

https介绍,加密解密(举例+必要性,对称/非对称加密介绍),数字摘要/指纹(介绍,应用(session id,网盘的秒传功能))

目录 https 引入 介绍 加密解密层 介绍 没有绝对的安全 使用ssl的弊端 加密解密 概念 加密 解密 秘钥 举例 现实中 网络中 加密的必要性 常见加密方式 对称加密 特点 非对称加密 特点 数字摘要/指纹 介绍 应用 session id 百度网盘的秒传功能 https …

21_Scala集合_可变数组ArrayBuffer

文章目录 ArrayBuffer1.创建可变数组ArrayBuffer2.增加数据3.删除数据4.修改数据5.查询数据Appendix ArrayBuffer ArrayBuffer可变数组–感觉优点类似于Java的ArrayList 1.创建可变数组ArrayBuffer –请注意下面的mutable import scala.collection.mutable.ArrayBuffer //m…

DuDuTalk:4G桌面拾音设备在银行网点服务场景的应用价值

随着科技的飞速发展&#xff0c;银行业也在不断地寻求创新以提高服务质量和效率。在这个过程中&#xff0c;4G桌面拾音设备作为一种新型的智能设备&#xff0c;其在银行网点服务场景中的应用价值逐渐凸显出来。本文将从多个角度探讨4G桌面拾音设备在银行网点服务场景的应用价值…