c
文章平均质量分 81
致守
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
localtime和gmtime获取的时间不可靠
然而,一个设备在预定关机后,意外地提前开机然后再次关机,这引起了我们的注意。通过代码审查和日志分析,我们发现设备在定时检测到当前时间符合条件后,会执行关机操作。为了进一步诊断问题,我们在代码中增加了打印时间戳的日志,并进行了长时间的挂测。在多线程环境中,为了避免全局指针被篡改的风险,建议使用线程安全的函数,如。这不仅可以避免潜在的线程安全问题,还可以确保程序的健壮性和可靠性。这与glibc的行为不同,可能是问题的关键所在。的结果篡改,这是一个严重的线程安全问题。是非线程安全的,我们将其替换为线程安全的。转载 2026-05-09 13:40:19 · 23 阅读 · 0 评论 -
Linux文件锁学习-flock, lockf, fcntl
这三个函数的作用都是给文件加锁,那它们有什么区别呢?首先flock和fcntl是系统调用,而lockf是库函数。lockf实际上是fcntl的封装,所以lockf和fcntl的底层实现是一样的,对文件加锁的效果也是一样的。后面分析不同点时大多数情况是将fcntl和lockf放在一起的。下面首先看每个函数的使用,从使用的方式和效果来看各个函数的区别。转载 2026-05-08 16:35:52 · 20 阅读 · 0 评论 -
Linux 中的文件锁定命令:flock、fcntl、lockfile、flockfile
文件锁定是保证系统稳定性和安全性的一种重要方法,在 Linux 系统中,我们可以使用 flock、fcntl、lockfile、flockfile 等命令来实现文件锁定操作。在使用这些命令时,需要注意锁定类型、命令参数、常见问题等内容,以保证锁定操作的正确性和可靠性。Linux 中的文件锁定命令:flock、fcntl、lockfile、flockfile-腾讯云开发者社区-腾讯云。转载 2026-05-08 16:29:44 · 17 阅读 · 0 评论 -
彻底搞懂size_t与ssize_t:从标准定义到实际应用场景
在C和C++语言中,size_t和ssize_t是用于表示内存大小和有符号尺寸的关键类型。它们的引入源于跨平台开发中对可移植性的需求。不同架构下的指针和整型长度存在差异,直接使用int或long可能导致不可预知的行为。为此,C标准库在<stddef.h>和中定义了这些类型以确保一致性。size_t被定义为无符号整数类型,通常由sizeof操作符返回。它在所有主流平台上都能容纳最大可能的对象尺寸。其对应的有符号版本是ssize_t,常用于系统调用如read()和write()转载 2026-01-20 17:13:32 · 131 阅读 · 0 评论 -
Linux 根据 socket inode 获取其进程pid
dev/sda 可以通过任何一个程序以任意方式读写,定义一套任意的私有格式(或文件系统)即可,而 /dev/eth0 则必须和对端共同遵守一套格式和逻辑,这同一套格式和逻辑就是 TCP/IP,将 TCP/IP 汇聚于系统本身或共享库中最直接,这取消了直接读写网卡的需求,而调用系统或共享库中协议例程的接口就是 socket。创建像 /dev/sda 一样的设备文件 /dev/eth0 读写网卡不难,像 /dev/net/tun 注册物理网卡就行,但你读写它时要自己手工做协议的封装和解封装。转载 2025-08-28 17:27:03 · 236 阅读 · 0 评论 -
TCP带外数据
传输层协议使用带外数据(out-of-band,OOB)来发送一些重要的数据,如果通信一方有重要的数据需要通知对方时,协议能够将这些数据快速地发送到对方.为了发送这些数据,协议一般不使用与普通数据相同的通道,而是使用另外的通道.linux系统的套接字机制支持低层协议发送和接受带外数据.但是TCP协议没有真正意义上的带外数据.为了发送重要协议,相应的,一个连接的流式套接口上的带外数据的工作原理也与此类似。下面列出的程序演示了一个简短的发送程序,他只可以传输一些小的字符串,然后停止发送带外数据。转载 2025-08-27 16:08:13 · 137 阅读 · 0 评论 -
Linux C 获取主机网卡名及 IP 的几种方法
在进行Linux时,经常会需要获取本机IP地址,除了常规的读取配置文件外,本文罗列几种个人所知的编程常用方法,仅供参考,如有错误请指出。转载 2025-08-21 12:46:17 · 390 阅读 · 0 评论 -
linux守护进程之setsid理解
一个守护进程的父进程是init进程,因为它真正的父进程在fork出子进程后就先于子进程exit退出了,所以它是一个由init继承的孤儿进程。有必要先介绍一下Linux中的进程与控制终端,登录会话和进程组之间的关系:进程属于一个进程组,进程组号(GID)就是进程组长的进程号(PID)。//调用进程必须是非当前进程组组长,调用后,产生一个新的会话期,且该会话期中只有一个进程组,且该进程组组长为调用进程,没有控制终端,新产生的group ID 和 session ID 被设置成调用进程的PID。转载 2025-08-14 18:11:34 · 102 阅读 · 0 评论 -
【Linux】守护进程( Daemon)的定义,作用,创建流程
因此,通常的做法是让"/"作为守护进程的当前工作目录,这样就可以避免上述的问题,当然,如有特殊需要,也可以把当前工作目录换成其他的路径,如/tmp,改变工作目录的常见函数是chdir。为什么要再次fork呢,假定有这样一种情况,之前的父进程fork出子进程以后还有别的事情要做,在做事情的过程中因为某种原因阻塞了,而此时的子进程因为某些非正常原因要退出的话,就会形成僵尸进程,所以由子进程fork出一个孙进程以后立即退出,孙进程作为守护进程会被init接管,此时无论父进程想做什么都随它了。转载 2025-08-14 17:30:42 · 230 阅读 · 0 评论 -
Linux--信号(万字详解!超完整!)
我们都知道,在管道通信时,读端关闭,写端一直进行,写就没有意义了,这时候操作系统,就会向进程发送SIGPIPE(13号信号),终止进程。转载 2025-08-06 12:38:33 · 421 阅读 · 0 评论 -
C语言网络编程:listen函数详解
根据TCP编程模型中我们可以看到之前的socket和bind接口是tcp服务器在为接收客户端的链接做准备,保证tcp的面向字节流,面向连接的可靠通信服务正常进行。接下来的listen端口则为我们进行三次握手与客户端进行链接的接口。TCP编程模型如下。转载 2025-07-23 16:24:08 · 215 阅读 · 0 评论 -
云原生虚拟化:一文读懂网络虚拟化之 tun/tap 网络设备
从上图可以更直观的看出 tun/tap 设备和物理设备的区别:虽然它们的一端都是连着网络协议栈,但是物理网卡另一端连接的是物理网络,而 tun/tap 设备另一端连接的是一个应用层程序,这样协议栈发送给 tun/tap 的数据包就可以被这个应用程序读取到,此时这个应用程序可以对数据包进行一些自定义的修改(比如封装成 UDP),然后又通过网络协议栈发送出去——其实这就是目前大多数“代理”的工作原理。tun/tap 设备是操作系统内核中的虚拟网络设备,是用软件模拟的网络设备,提供与硬件网络设备完全相同的功能。转载 2025-07-02 16:16:04 · 619 阅读 · 0 评论 -
Linux串口编程详解(阻塞模式、非阻塞模式、select函数)
之前一直觉得串口编程很简单,这两天仔细研究后发现串口里的各种参数还挺复杂,稍不注意就容易出错,这里总结一下网上的各种文章及自己的理解与实践。功能描述:用于打开或创建文件,成功则返回文件描述符,否则返回-1,open返回的文件描述符一定是最小的未被使用的描述符参数flags:一些文件模式选择,有如下几个参数可以设置上面三个参数在设置的时候必须选择其中一个!下面的参数是可选的下面三个常量同样是选用的,他们用于同步输入输出。转载 2025-06-21 15:44:18 · 326 阅读 · 0 评论 -
【C/C++ 关键字 函数说明符 】C/C++ _Noreturn关键字(表明调用完成后函数不返回主调函数)
通常,我们在设计那些不会返回到调用者的函数时使用_Noreturn关键字,例如,终止程序的函数,或者抛出异常的函数。在实际编程中,我们可能会遇到一些特殊的函数,这些函数在被调用后,可能会导致程序终止,或者进入一个无限循环,或者抛出一个异常,这些情况下,函数都不会返回到调用它的地方。在C++的各个版本中,_Noreturn关键字的应用都是一致的,都是用来标记那些不会返回的函数。在这一章节中,我们将深入探讨_Noreturn关键字在元模板编程中的应用,以及它在C++11, 14, 17, 20中的变化和应用。转载 2025-06-07 15:03:18 · 237 阅读 · 0 评论 -
最全常用正则表达式大全
18. 负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$17. 正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$转载 2025-05-17 10:36:22 · 2020 阅读 · 0 评论 -
Muduo源码Poller类 + EpollPoller类详解
Poller class 是IO multiplexing的封装。在muduo中它是一个抽象类,因为muduo同时支持poll和epoll两种IO multiplexing机制。Poller是EventLoop的间接成员,只供其owner EventLoop在IO线程中调用,因此无需加锁。其生命周期和EvenLoop相等。Poller并不拥有Channel,Channel在析构前必须自己unregister(EventLoop::removeChannel()),避免悬空指针。转载 2025-05-12 19:04:44 · 98 阅读 · 0 评论 -
pread与pwrite使用
在阅读seastar源码时发现有使用pread函数,这也是第一次认识pread函数,平时用read比较多。转载 2025-05-12 18:56:45 · 178 阅读 · 0 评论 -
Linux系统函数read()/write()/pread()/pwrite()的区别
在Linux和UNIX中有很多的输入输出函数,有时真是让想跟它攀点关系的菜鸟们束手无策。先来看看都有哪些函数,通过解析与总结,看看能不能让大家能这些函数有个理性的认识,哦,原来是这么回事,也就算我没白花这份闲。内核文件I/O->标准库I/O->高级I/O->IPC中1. read()/write();2. pread()/pwrite();3. getc()/putc();4. fgetc()/fputc();5. getcha转载 2025-05-12 18:55:27 · 214 阅读 · 0 评论 -
基于栈的内存非配--alloca函数
alloca是一个在 C 和 C++ 中可用的函数,用于在栈上动态分配内存空间。它类似于malloc函数,但是分配的内存空间在函数返回后会自动释放,无需显式调用free函数。以下是alloca函数的详细介绍:size:要分配的内存空间的大小,以字节为单位。alloca函数返回一个指向分配的内存空间的指针。如果无法分配所需的内存空间,则函数的行为是未定义的。alloca函数在栈上分配内存,因此分配的内存空间的生命周期与调用函数的栈帧绑定。一旦函数返回,分配的内存空间就会自动释放,无需手动释放。转载 2025-05-10 11:12:45 · 152 阅读 · 0 评论 -
C++11 静态断言(static_assert)
最后再举个例子,用来判断某个类是否有某个指定名字的成员,供参考和体验。static_assert的错误提示,VC比GCC稍微友好一些,VC对上下文和调用堆栈都有较清晰描述,相比之下,GCC的提示简陋一些,但也算比较明确吧,本来么,static_assert很大程度上就是为了编译器的提示信息更加友好而存在的。是运行期断言,它用来发现运行期间的错误,不能提前到编译期发现错误,也不具有强制性,也谈不上改善编译信息的可读性,既然是运行期检查,对性能当然是有影响的,所以经常在发行版本中,assert都会被关掉;转载 2025-04-15 19:10:03 · 270 阅读 · 0 评论 -
C语言宏定义##连接符和#符的使用
#被称为连接符(concatenator),用来将两个Token连接为一个Token。注意,这里连接的对象是Token即可,而不一定是宏的变量。在经过预处理后这一声明变为:int int_namea;可以看出,预编译时,宏参数n被替换,并和name连接成一个整体,然后整体替换NAME宏。属于编译器预处理的范畴,属于编译器概念(而非运行期概念)。这样每次divider(除数)为0的时候便会在。上输出一个提示信息。转载 2025-04-15 19:09:04 · 189 阅读 · 0 评论 -
assert的实现原理浅析(转载)
(2)_wassert函数和后面的0,构成一个逗号表达式,因此part2的返回值是0。因此( (part1) || (part2) )的返回值为0或1取决于part1。即定义了NDEBUG这个宏,那么assert宏被定义为((void)0)。这里的宏,什么都不做,而且同时不能使用它的返回值。实际上,它是一个宏,定义如下。part1为真时,不会被调用。为什么要把( (part1) || (part2) )的返回值转换成void型了?所以,这就避免使用assert宏的返回值,实际上也不能使用它的返回值。转载 2025-04-15 19:08:01 · 176 阅读 · 0 评论 -
C++ extern
file02.cpp使用的是file01.cpp中定义好的cats 和dogs,在file01.cpp可以不使用extern关键字,但是在file02.cpp中不使用extern关键字则这些 外部声明会变成定义。而且还会违反单定义规则。如果要在多个文件中使用外部变量,只需在一个文件中包含该变量的定义(ORD),但在使用改变量的其他所有文件中,都必须使用extern声明这个变量。(referencing declaration)简称为声明,它不给变量分配空间,因为它引用已有变量。在全局变量中,引用声明使用。转载 2025-02-19 12:58:16 · 97 阅读 · 0 评论 -
C++模板(template)详解教程(很多代码示例)
函数模板背景:比如我们需要来比较不同数据类型的两个值,并指出第一个值与第二个值的大小关系,如果此时只定义只比较一种参数类型的函数,略显麻烦。此时引出了函数模板此时就不用为每个类型定义一个新的函数了。比如:return 0;模版定义:以关键字template开始,后跟一个模板参数列表,这是一个逗号分隔的一个或多个模板参数的列表,用小于号(<)和大于号(>)包围起来。实例化private:T1 first;T2 second;转载 2025-02-19 09:02:01 · 1527 阅读 · 0 评论 -
突破编程_C++_C++11新特性(完美转发 forward)
std::forward 是 C++11 中引入的一个模板函数,主要用于在模板函数或模板类中实现参数的完美转发(perfect forwarding)。完美转发是指函数或类模板可以将其参数原封不动地转发给另一个函数或类模板,同时保持被转发参数的左右值特性(lvalue 或 rvalue)。这里,T 是一个模板参数,它代表了需要被转发的参数的原始类型。std::remove_reference<T>::type 是一个类型特性,用于从 T 中移除引用,从而得到原始类型。转载 2025-02-19 08:58:41 · 172 阅读 · 0 评论 -
又学懂辣 !五分钟带你掌握C++中的左值,右值,左值引用,右值引用 以及++i和i++的深度刨析 史上最详细!
1.i++返回的是临时值(右值),涉及创建和管理临时变量。2.++i返回的是变量i本身(左值),直接操作和返回变量,没有额外的临时变量开销。3.在实际使用中,++i通常比i++更高效,所以能用++i就尽量不用i++。总结1.左值是具有持久性且可以获取地址的对象或表达式,通常出现在赋值操作符的左边,例如变量或具名对象。2右值是临时性的、无法获取地址的对象或表达式,通常出现在赋值操作符的右边,例如临时计算的结果或字面量。3.左值引用使用声明,用于操作现有对象而避免复制,如传递参数和返回内部对象引用。转载 2025-02-19 08:55:59 · 220 阅读 · 0 评论 -
【C语言深入】细聊C语言中的“左值”和“右值”
这里需要注意的是任何变量在进行计算的时候,用的都是它的右值,所以表达时所产生的结果都是一个常量(也可以说是一个副本),所以对于指针的自加或自减(前置和后置都一样),其实分析方式都和上图一样,所以都是合法的右值,而不是一个合法的左值。对指针解引用时,它产生的结果也是既可以作为左值也可以作为右值,作为左值是它表示的是指针中存储的地址的那块空间,作为右值时它表示的是指针中存储的地址的那块空间中的内容。而且如今的编译器都是动态的分配内存空间的,也就是说程序这次执行和下一次执行时,同一个变量的地址是不同的。转载 2025-02-19 08:54:33 · 702 阅读 · 0 评论 -
C++ 新特性 | C++ 11 | std::forward、万能引用与完美转发
传统上,当一个左值传递给一个函数时,参数会以左值引用的方式进行传递;,当它作为参数时,有可能被一个左值/左值引用或右值/右值引用的参数初始化,这需要通过类型推导,推导后得到的参数类型会发生类型变化,这种变化就称为引用折叠。建议仅用于模板函数,对于非模板的,因为不涉及到类型推导,所以使用完美转发是没有意义的。引用折叠是一种特性,允许在模板元编程中使用引用类型的参数来创建新的引用类型。的类型来说,其既可以绑定左值,又可以绑定右值,而这个的前提是。返回左值引用,相应的,当接收一个右值作为参数时,转载 2025-02-17 19:57:24 · 477 阅读 · 0 评论 -
突破编程_C++_C++11新特性(完美转发 forward)
std::forward 是 C++11 中引入的一个模板函数,主要用于在模板函数或模板类中实现参数的完美转发(perfect forwarding)。完美转发是指函数或类模板可以将其参数原封不动地转发给另一个函数或类模板,同时保持被转发参数的左右值特性(lvalue 或 rvalue)。这里,T 是一个模板参数,它代表了需要被转发的参数的原始类型。std::remove_reference<T>::type 是一个类型特性,用于从 T 中移除引用,从而得到原始类型。转载 2025-02-17 19:42:22 · 126 阅读 · 0 评论 -
C++11的模板类型判断——std::is_same和std::decay
在模板里可以通过std::is_same判断模板的类型,从而实现对不同类型的区别对待在堆类型要求不是非常严格的情况下,可以使用std::decay把类型退化为基本形态,结合std::is_same用,可以判断出更多的情况C++11的模板类型判断——std::is_same和std::decay_c++ 判断模板类型-CSDN博客。转载 2025-02-17 19:34:49 · 241 阅读 · 0 评论 -
C++中构造函数的分类和三种调用方法(附C++代码)
已经就是C++中构造函数的分类和三种调用方法,希望能帮到你!本人参考学习的是黑马程序员,仅作为笔记记录。C++中构造函数的分类和三种调用方法(附C++代码)_c++ 调用构造函数-CSDN博客。转载 2025-02-17 18:51:16 · 516 阅读 · 0 评论 -
编译器对于C++构造函数的优化和C++17之后对构造函数的优化
发现竟然又只输出了一条,但是我们明明加了-fno-elide-constructors,我认为老师所说的优化应该指的就是这个吧,不管加不加-fno-elide-constructors,编译器都会进行优化。李伟老师在课程中提到最好不要对移动构造函数引入delete限定符,是因为C++17有一个优化,这句话听课的时候不太明白,先不加限定符在C++17下跑一下试试。手册上的解释是这样的。可以看出来,编译出现了错误,这就很迷了,之前明明分析的是编译器会默认对其构造函数引入优化,不应该没使用移动构造函数吗?转载 2025-02-17 15:38:29 · 102 阅读 · 0 评论 -
c++中返回值优化(RVO)和命名返回值优化(NRVO)介绍
半年前就想写一篇关于RVO和NRVO的介绍,但碍于没什么时间去写博客。在跟身边人进行学术探讨的时候,会发现部分人可能尝到了编译器给它做返回值优化的好处,知道这段代码被优化了,但为什么 如何去做,却不知道。因此,为了尝试说明RVO和NRVO的好处、使用场景、局限性等,在看了数个StackOverflow的讨论之后,有了这篇博客。转载 2025-02-17 15:36:47 · 221 阅读 · 0 评论 -
C++移动构造函数,移动赋值和编译选项-fno-elide-constructors
说明:使用C++98标准编译时,需要注释掉。选项,编译器会进行良好的优化。转载 2025-02-17 15:34:46 · 120 阅读 · 0 评论 -
shared_ptr 是线程安全的吗?
具体来说,shared_ptr<Foo> 包含两个成员,一个是指向 Foo 的指针 ptr,另一个是 ref_count 指针(其类型不一定是原始指针,有可能是 class 类型,但不影响这里的讨论),指向堆上的 ref_count 对象。此后 sp2 仍然能安全地管理 Foo 对象的生命期,并安全完整地释放 Foo,不会出现 delete void* 的情况,因为 delete 的是 ref_count.ptr,不是 sp2.ptr。(即 read g),以下完成了步骤 1,还没来及执行步骤 2。转载 2025-02-10 23:10:12 · 392 阅读 · 0 评论 -
使用 ltrace 进行 Linux 库函数调用跟踪分析
ltrace是一个强大的工具,尤其在需要调试或分析程序与共享库之间的交互时非常有用。它不仅能展示库函数的调用顺序,还能提供有关参数和返回值的详细信息,帮助开发人员更好地理解和优化程序。使用 ltrace 进行 Linux 库函数调用跟踪分析_迎难学字的技术博客_51CTO博客。转载 2025-02-09 22:21:01 · 205 阅读 · 0 评论 -
杂谈:Linux时间管理之gettimeofday实现
总结:这篇文件有点长,但是实际上这篇文章只是想说clock_gettime支持vdso,而vdso是通过内存映射的方式把内核态的数据直接映射到用户态,但是看似简单的过程,要想没有跳跃的弄清楚还真的需要些功夫,比如glibc的结构组织,vdso,内核时间更新等等,很是复杂,而这篇文章还没有涉及内核维护时间的内容,见下篇文章吧。最终我们看到无论哪种情况下调用的是__clock_gettime64函数,如果想知道如何在glibc中找到这个函数的可以参考这个文章,写的很清楚(在__TIMESIZE!转载 2025-02-09 22:19:30 · 238 阅读 · 0 评论 -
Linux时间子系统1:gettimeofday和clock_gettime实现分析
显然,sys_gettimeofday和sys_settimeofday这两个系统调用是用来支持上面两个函数功能的,值得一提的是:这些系统调用在新的POSIX标准中 gettimeofday和settimeofday接口函数被标注为obsolescent,取而代之的是clock_gettime和clock_settime接口函数。但是以上ID并没有包含全部的clock类型,时钟类型,以及时间与时钟源的关系,我们后面再来分析。这里的时间的含义是什么,我们获取到的是什么时间,这个问题下面再讨论。转载 2025-02-09 22:17:06 · 489 阅读 · 0 评论 -
深入理解linux下的短延迟:nanosleep,sleep
最近在使用nanosleep的时候又踩坑了。于是整理下linux短延迟的用法。转载 2025-02-09 21:20:27 · 614 阅读 · 0 评论 -
gettimeofday和clock_gettime是不是系统调用?
vdso机制说白了就是在用户空间帮我们实现了一些特定的系统调用,用户进程启动时这些代码会被自动映射到进程地址空间的用户空间中。这样的话,当我们利用vdso调用到这些系统调用时,就不会陷入内核了。直接调用这些系统调用对应的glibc包装函数就可以,因为这些glibc包装函数默认会使用vdso。实际上都是系统调用,但是调用得当的话,可以避免陷入内核,从而提高性能。dynamic shared object)机制帮我们做到了在调用这些系统调用时不陷入内核,从而提高了性能。,而这个函数是会陷入内核的。转载 2025-02-09 21:17:28 · 193 阅读 · 0 评论
分享