
Linux编程
文章平均质量分 86
介绍Linux编程的知识
执假以为真
Learning, Coding, Writing
展开
-
Linux中常见的过滤拦截
Linux中常见的拦截过滤本文着重介绍Linux平台上常见的拦截: 用户态动态库拦截。 内核态系统调用拦截。 堆栈式文件系统拦截。 inline hook拦截。 LSM(Linux Security Modules) eBPF Hook拦截。(本文新增) 动态库劫持Linux上的动态库劫持主要是基于LD_PRELOAD环境变量,这个环境变量的主要作用是改变动态库的加载顺序,让用户有选择的载入不同动态库中的相同函数。但是使用不当就会引起严重的转载 2022-05-15 18:07:29 · 1979 阅读 · 0 评论 -
CPU缓存,cache line 和 False Sharing 简介
简介CPU缓存,cache line 和 false sharing 的基本知识原创 2021-12-12 23:45:52 · 1201 阅读 · 0 评论 -
Linux下使用backtrace打印函数调用栈信息
Linux下使用backtrace打印函数调用栈信息Java和Python等语言都有比较简便的方法可以打印函数调用栈,那么在Linux下使用C语言有没有办法呢?据说有多种方法。本文介绍最基本的方法,即使用 glibc 的 backtrace() 和 backtrace_symbols() 等 API.在 Linux 下,运行 man 命令可以查看到帮助文档。man 3 backtrace文档并不长。下面翻译主要部分如下:首先,需要包含头文件,并看一下相关的3个API的声明:#include原创 2021-12-04 23:26:52 · 5183 阅读 · 0 评论 -
关于条件变量的总结
条件变量(Condition Variable)的要点:条件变量的作用 - 线程同步手段: 条件变量控制的是线程的挂起与唤醒,所使用的主要相关函数是 “唤醒” 和 “等待”。在C++11中,相关函数是: notify_one/notify_all,wait/wait_for/wait_until在Linux编程中,相关函数是: pthread_cond_signal/pthread_cond_broadcast,pthread_cond_wait/pthread_cond_timedw原创 2021-04-06 22:38:25 · 347 阅读 · 0 评论 -
lock-free编程系列
lock-free编程,讲究的是高效率,因此不能再使用锁,而是使用原子性操作。而原子性操作的实现,可能有多种方式,比如,原创 2021-03-11 23:20:19 · 388 阅读 · 0 评论 -
简介 Tagged Pointer (标记指针)
在计算机科学中,Tagged Pointer 是一个指针(内存地址),它具有与其关联的附加数据,例如,indirection bit 或 引用计数。这些附加数据通常是“折叠”在指针中,意思就是,利用内存寻址的某些属性存储在表示内存地址的数据中。该名称来自 “tagged architecture” system,该系统在硬件级别保留位以指示每个单词的含义。附加数据被称为“标签”,尽管严格说来,“标签”是指数据类型,而不是数据; 但是,“tagged pointer”的用法无处不在。将tag折叠进指针原创 2021-03-11 23:11:09 · 1797 阅读 · 0 评论 -
简介ABA问题
在多线程计算中,在同步期间会发生ABA问题,当一个位置被读取两次,两次读取具有相同的值,并且“值相同”用于指示“什么都没有改变”时。但是,另一个线程可以在两次读取之间执行并更改值,执行其他工作,然后将值改回,因此,即使第二个线程的工作违反了该假设,也使第一个线程认为“什么都没有改变”。当多个线程(或进程)访问共享数据时,会发生ABA问题。以下是将导致ABA问题的事件序列:进程 P1 从共享内存中读取值 A,进程 P1 被抢占,从而允许进程 P2 运行,进程 P2 在抢占之前将共享内存值 A 修改原创 2021-03-11 23:05:50 · 1233 阅读 · 0 评论 -
简介CAS(比较并交换)- lock-free编程的基石之一
概览在计算机科学中,比较交换(CAS)是用于多线程以实现同步的原子指令。 它将存储位置的内容与给定值进行比较,并且只有它们相同时,才将该存储位置的内容修改为新的给定值。 这是作为单个原子操作完成的。原子性保证了根据最新信息计算出新值; 如果与此同时值已由另一个线程更新,则写入将失败。 操作的结果必须表明它是否执行了替换; 这可以通过简单的布尔响应(此变量通常称为“比较设置”),也可以通过返回从内存位置读取的值(而不是写入该值)来完成。比较和交换操作是以下伪代码的原子版本:// 以下函数视为一个原子操原创 2021-03-11 22:58:37 · 769 阅读 · 0 评论 -
抢占是如何发生的
进程切换有自愿(Voluntary)和强制(Involuntary)之分,在前文中详细解释了两者的不同,简单来说,自愿切换意味着进程需要等待某种资源,强制切换则与抢占(Preemption)有关。抢占(Preemption)是指内核强行切换正在CPU上运行的进程,在抢占的过程中并不需要得到进程的配合,在随后的某个时刻被抢占的进程还可以恢复运行。发生抢占的原因主要有:1. 进程的时间片用完了,或者 2. 优先级更高的进程来争夺CPU了。抢占的过程分两步,第一步触发抢占,第二步执行抢占,这两步中间不转载 2021-03-11 22:47:13 · 1182 阅读 · 0 评论 -
SystemV信号量与POSIX信号量简介
转载自:http://linuxperf.com/?p=25对原文做了一些删减和结构上的优化。SystemV 信号量SystemV 信号量是内核对象,由内核统一管理; 它的存续不依赖于进程,即使进程退出也仍然存在。semget(2): 向内核提出申请,内核根据需要创建新的信号量或关联已存在的信号量,每组信号量都有唯一的ID标识,可以被多个进程共享。semop(2) 或 semtimedop(2): PV操作。semctl(2): 删除信号量。(进程即使不存在,信号量也存在于内核中,除非调用此函转载 2021-01-14 22:43:06 · 504 阅读 · 0 评论 -
futex简介
找到一篇很好的文章,讲得深入浅出;貌似原网站也很不错。转载自 http://linuxperf.com/?p=23futex (fast userspace mutex) 是Linux的一个基础构件,可以用来构建各种更高级别的同步机制,比如锁或者信号量等等,POSIX信号量就是基于futex构建的。大多数时候编写应用程序并不需要直接使用futex,一般用基于它所实现的系统库就够了。futex的性能非常优异,它是怎样做到的呢?这要从它的设计思想谈起。传统的SystemV IPC(inter proces转载 2021-01-13 22:38:43 · 3575 阅读 · 0 评论 -
实时信号(real-time signal)和标准信号(standard signal)的区别
实时信号和标准信号有什么区别呢?man 7 signal , 再 search SIGRTMIN. 文档中的描述如下:Real-time signals are distinguished by the following:Multiple instances of real-time signals can be queued. By contrast, if multiple instances of a standard signal are delivered while that原创 2020-12-22 17:26:17 · 2465 阅读 · 0 评论 -
设定Linux C/C++ 程序的执行时限
给Linux C/C++程序设定执行时限时间管理,是每个现代人的必修课。给一个任务固定的执行时间,是控制整体进度的一种常用方法。回到程序中: 如何让一个运行时间可能比较长的Linux C/C++程序能够有一个执行时限呢?这就是本文想解答的一个问题。最直接的方法就是起一个timer,并且安装 SIGRTMIN 信号的处理函数;然后在这个信号处理函数里获取本进程的pid,再向本进程发送 SIGTERM 信号来杀死自己。具体代码如下:// g++ timer.cpp -lrt #include &l原创 2020-12-21 23:14:53 · 2007 阅读 · 0 评论 -
写一个实用的信号处理函数
有的时候,我们的进程或daemon会被莫名其妙地杀死。凶手是谁?这往往并不容易定位。虽然SIGKILL和SIGSTOP信号并不能被捕捉,但其他很多杀死进程的信号还是可以被捕捉并被处理的,如:SIGTERM、SIGINT、SIGABRT. 本文就是介绍这样一个完整的信号处理程序,用以记录凶杀及其幕后主使。问题与分析问题描述以处理 SIGTERM 信号为例,写一个信号处理函数。要求:能够追踪到信号的发送者及其所有祖先进程并打印它们的pid和命令名。处理完以上工作后,让原系统配置的信号处理函数来处理此原创 2020-07-17 23:09:35 · 542 阅读 · 0 评论 -
Linux下动态链接库的2种链接方式
Linux下动态链接库的2种链接方式方式一通过 dlopen, dlsym, dlerror, dlclose 在代码中直接打开与使用动态链接库dlopen 用于打开动态链接库,返回句柄dlsym 使用dlopen返回的句柄与函数名来获得函数位置,返回函数指针dlclose 关闭动态链接库看以下示例程序// fibo.cpp#include <iostream>...原创 2020-02-22 23:01:17 · 1884 阅读 · 0 评论 -
【译】Linus有礼貌地批评了一位开发者关于spinlock
听说最近Linus耐心而又礼貌地批评了一个开发者。原文在这里:https://www.realworldtech.com/forum/?threadid=189711&curpostid=189723今天比较有兴趣地把原文翻译了一遍。不是很难懂,但中间还是加了很多译注,都是笔者自己的一些理解,也不敢保证全对。大体上应该差不多吧。以下先贴笔者的译文,再贴原文。译文:整篇文章都是错误的,...原创 2020-01-09 00:42:30 · 1038 阅读 · 0 评论 -
VSS, RSS, PSS, USS
转载自”超超Boy“:https://www.cnblogs.com/jycboy/p/5453533.htmlVSS:Virtual Set Size,虚拟耗用内存它是一个进程能访问的所有内存空间地址的大小。这个大小包含了一些没有驻留在RAM中的内存,就像mallocs已经被分配,但还没有写入。VSS很少被用来测量程序的实际使用内存。RSS:Resident Set Size...转载 2019-12-05 22:53:19 · 516 阅读 · 0 评论 -
内存优化总结
转自:http://www.cnhalo.net/2016/06/13/memory-optimize/概述需求系统的物理内存是有限的,而对内存的需求是变化的, 程序的动态性越强,内存管理就越重要,选择合适的内存管理算法会带来明显的性能提升。比如nginx, 它在每个连接accept后会malloc一块内存,作为整个连接生命周期内的内存池。 当HTTP请求到达的时候,又会mal...转载 2019-03-24 22:13:02 · 411 阅读 · 0 评论 -
APUE笔记之16-17章-网络IPC套接字_UNIX域套接字
第16章 网络IPC: 套接字套接字描述符正如使用文件描述符访问文件,应用程序用套接字描述符访问套接字。套接字描述符在UNIX系统中被当作是一种文件描述符。事实上,许多处理文件描述符的函数(如read和write)可以用于处理套接字描述符号。socket函数:创建一个套接字#include <sys/socket.h>// 成功,返回套接字描述符;出错,返回...原创 2019-03-09 21:41:47 · 325 阅读 · 0 评论 -
APUE笔记之15章_进程间通信
第15章 进程间通信进程间通信主要有:管道(pipe) 有名管道(FIFO) XSI之消息队列 XSI之信号量 XSI之共享存储 POSIX信号量 Socket(16章) UNIX域SOCKET(17章)1. 管道管道有2种局限性:历史上,它们是半双工的 只能在具有公共祖先的2个进程之间使用。通常,一个管道由一个进程创建,在进程调用fork之后,这个管道就...原创 2019-03-09 12:31:57 · 372 阅读 · 0 评论 -
APUE笔记之14章_高级I/O
第14章 高级I/O非阻塞I/O10.5节曾将系统调用分成2类:“低速”系统调用 和 其他。低速系统调用是指可能使进程永远阻塞的一类系统调用,如:读管道、终端设备、网络设备的数据并不存在,读操作可能使调用者永远阻塞; 如果数据不能被相同的文件类型立即接受(如管道中无空间、网络流控制),写操作可能会使调用者永远阻塞; 以只写模式打开FIFO,在没有其他进程已经用读模式打开该FIF...原创 2019-03-09 00:11:20 · 291 阅读 · 0 评论 -
APUE笔记之11-12章_线程_线程控制
第11章 线程即使在单处理器上,某些线程阻塞的时候,其他线程还是可以运行的,因此多线程仍然可以改善响应时间和吞吐量。线程私有的:线程ID 一组寄存器值 栈 调度优先级和策略 信号屏蔽字 error变量(见1.7节) 线程私有数据(key,见12.6节)进程内所有线程共享的:代码段 全局内存和堆内存 栈 文件描述符线程相关操作线程比较 &...原创 2019-03-07 23:14:07 · 319 阅读 · 0 评论 -
APUE笔记之10章_信号
第10章 信号介绍信号是软件中断。信号提供异步事件处理方法。早期的信号模型 不可靠,信号可能丢失。POSIX.1对可靠信号例程进行了标准化。调用kill(2)函数可将任意信号发送给另一个进程或进程组,但有限制:信号的发送进程和接收进程的所有者必须相同,或者, 发送信号进程的所有者是超级用户当某个信号出现时,内核有3种处理方式:忽略:有2种信号不能被忽略 - SIG...原创 2019-03-06 10:00:28 · 341 阅读 · 0 评论 -
APUE笔记之7-9章:进程环境、进程控制、进程关系
第7章 进程环境进程终止有8种方式使得进程终止,其中5种为正常终止,3种为异常终止正常终止的方式:从main返回0 调用exit 调用 _exit 或 _Exit 最后一个线程从其启动例程返回 最后一个线程调用 pthread_exit异常终止的方式:调用 abort 接到一个 signal 最后一个线程对取消请求做出响应_exit 和 _Exit 立即进入...原创 2019-03-05 00:23:47 · 296 阅读 · 0 评论 -
APUE笔记之1-5章:UNIX基础、标准、文件I/O、文件与目录、标准I/O库
第1章 UNIX基础知识Unix体系结构不带缓冲的I/O:函数 open、read、write、lseek、close 提供了不带缓冲的I/O. 这些函数都使用文件描述符。头文件 <unistd.h> 以及2个常量 STDIN_FILENO 和 STDOUT_FILENO 是 POSIX标准的一部分。标准I/O:比如, fgets, fputs,...原创 2019-03-04 23:17:01 · 406 阅读 · 0 评论 -
Linux块设备I/O栈浅析
看了网上若干关于Linux I/O栈的文章,觉得这篇还可以。故转载之。另外,在本文结尾,再配上比较新的(kernel 4.10)的Linux I/O栈的架构图等。原文:http://www.sysnote.org/2015/08/06/linux-io-stack/ 块存储,简单来说就是使用块设备为系统提供存储服务。块存储分多种类型,有单机块存储,网络存储(如NAS,SAN等),分布式...转载 2019-01-01 17:24:41 · 920 阅读 · 0 评论 -
Linux中的文件描述符与打开文件之间的关系
转载自:https://blog.youkuaiyun.com/cywosp/article/details/389652391. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用...转载 2018-06-30 23:51:50 · 178 阅读 · 0 评论 -
Linux进程权限
对Linux的进程权限进行了一些总结。本文是Linux系统下讨论。注意,Linux和Unix有很多不同的地方,并且各个不同的Unix系统也有很多不同。本文讨论对象:ruid: real user id,即实际用户,也即当前登录的用户euid: effective user id, 即有效用户,也即以哪个用户身份来执行脚本suid: saved user id, 保存用户fuid...原创 2018-02-04 00:37:24 · 4328 阅读 · 0 评论 -
ruid和euid的区别
译自:http://unix.stackexchange.com/questions/191940/difference-between-owner-root-and-ruid-euidroot用户的权限root总是具有对文件和目录的完全访问权限。文件主人一般来说也是这样,但有时候不是。如下: -r-xr—– 1 user1 users 199 Oct 14 18:42 ot...翻译 2017-02-17 23:47:38 · 3008 阅读 · 0 评论 -
select, poll, epoll
在上上上上篇博文中,转载了关于Linux IO的一些基本知识。但这只是原文的一半。在原文的另一半中,介绍了select、poll、epoll的一些知识。当然,最好是去看看APUE;不过看看速成的快餐博客了解个大概也不错。下面就是转载那原文的另一半。原文:https://segmentfault.com/a/1190000003063859略有删节。select,poll,epo转载 2016-04-16 12:15:49 · 518 阅读 · 0 评论 -
Linux IO模式
转载了半篇文章,详细讲解了Linux下的几种IO模式。转载 2016-03-21 23:40:44 · 757 阅读 · 0 评论 -
僵尸进程的原因以及预防方法和解决方法
现象及原因僵尸进程的常见现象,就是某些进程即使以root帐号运行 kill -9 也杀不死。之所以杀不死,是因为该进程虽然结束,但是它的内核栈(如进程描述符)依然驻留在内存中。具体形成原因,就是没有做以下3个预防方法中的任何一个。预防出现僵尸进程的方法:1. 等; 2. 不等; 3. 是孤儿而非僵尸预防办法一、在fork()/execve()过程中,在父进程fork()之前安装SIGCHLD信号处...原创 2016-03-17 23:59:20 · 2106 阅读 · 0 评论 -
关于线程的一些概念和关于线程返回值的简单示例代码
整理了一篇网上的文章,润饰之处比较多。出处已不详。关于返回值的部分,本来看看文档也能知道。不过既然整理了,也就发出来吧。转载 2016-03-08 23:50:26 · 713 阅读 · 0 评论 -
线程的结合与分离
原文:http://www.cnblogs.com/mydomain/archive/2011/08/14/2138454.htm线程的分离与结合在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached)。一个可结合的线程能够被其他线程收回其资源和杀死;在被其他线程回收之前,它的存储器资源(如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储...转载 2016-03-08 22:02:20 · 822 阅读 · 0 评论 -
可重入和线程安全
线程安全如果一个函数在同一时刻可以被多个线程调用而最终结果正确,就称该函数是线程安全的。线程安全问题都是由共享的资源,如全局变量、静态变量、IO等引起的。一个函数如果不需要访问共享资源,那么为调用该函数的每个线程提供数据副本即可,该函数是线程安全的一个函数如果访问的是只读的共享资源,那么该函数是线程安全的;一个函数如果访问的是非只读的共享资源,那么需要利用互斥锁等提供线程同步,以确保程序以确定的方...原创 2016-02-09 12:43:30 · 645 阅读 · 0 评论