随笔分类 - Linux编程技术
摘要:There are times when you want to wrap a library function in order to provide some additional functionality. A common example of this is wrapping the standard library’s malloc() and free() so that you can easily track memory allocations in your program. While there are several techniques for wrapping library functions, one well-known method is using dlsym() with RTLD_NEXT to locate the wrapped function’s address so that you can correctly forward calls to it.
阅读全文
摘要:Maybe virtual memory over commit is prevented in your system. If it is prevented, then the virtual memory can not be bigger than sizeof physical RAM +
阅读全文
摘要:1,跳过某个特定信号 (gdb) handle SIGPIPE nostop noprint pass 2,break在特定的系统调用处 (gdb) catch syscall 3 3,遇到一个断点的时候执行一组commands (gdb) commands 1 #在断点1出现的时候执行下面一组命令
阅读全文
摘要:简述了几种解决dpdk无法分配出连续大页面的解决方法。
阅读全文
摘要:在bash中,如果循环在一个子shell中运行,那么在循环中对循环外面的变量的更改将在循环退出后不可见。像下面的例子: 最后面的echo输出的var仍然是1。原因是while循环位于管道中,这意味着在运行过程中,while循环实际是位于一个新的SHELL中的,while循环中的var变量和文件开头定
阅读全文
摘要:在高性能并发服务器中,对于共享对象的读写是最常见的操作之一,比如全局配置类对象的并发读取和更新,以及更复杂的如copy on write btree、堆栈等的并发读写,最基本的操作都可以简化理解为通过全局共享的指针,并发读取和更新指针所指向对象的操作。
阅读全文
摘要:简要介绍如何利用LD_PRELOAD环境变量来劫持库函数。
阅读全文
摘要:linux 多线程信号总结(一) 1. 在多线程环境下,产生的信号是传递给整个进程的,一般而言,所有线程都有机会收到这个信号,进程在收到信号的的线程上下文执行信号处理函数,具体是哪个线程执行的难以获知。也就是说,信号会随机发个该进程的一个线程。 2 signal函数BSD/Linux的实现并不在信号
阅读全文
摘要:Valgrind可以有效地监测处大多数内存问题,你肯定忍不住会想,既然c/c++的内存问题这么常见,为什么不在编译器中加入内存问题检测的功能呢? 很可惜,GCC中还目前还不支持内存检测,可喜的是,clang支持。这里我们看看如何用clang发现内存问题
阅读全文
摘要:在用C/C++编程的时候,经常会出现下面三种内存问题:
内存泄漏
悬挂指针
多次释放同一块内存
本系列文章简要介绍排查这三个问题的工具和方法,先看看Valgrind
阅读全文
摘要:我们的一个服务器软件在线上环境运行时出现了内存缓慢增长的问题。用valgrind测试 MySQL的C客户端mysqlclient发现,它在正常的使用中会被valgrind报出存在内存泄漏。1正常使用场景下面的代码是使用mysqlclient读取数据的最常用的代码#include #include i...
阅读全文
摘要:从这篇文章中可以看出,setitimer只能实现一个定时器,如果多次调用setitimer,旧值都会被覆盖掉。如何用setitimer实现多个定时器呢?下面是我的一个实现,具体的方法是:用链表从小到大维护这些定时器的信息,表头元素的定时器时间最短。当有新的定时器加入时,将它插入到合适的位置;当一个定时时间到达后,更新链表中所有定时器的剩余时间,再次调用setitimer。废话不多说,直接上代码:#include #include #include #include #include typedef struct my_timer_s my_timer_t;struct my_timer_s {
阅读全文
摘要:在服务端程序设计中,与时间有关的常见任务有:获取当前时间,计算时间间隔;定时操作,比如在预定的时间执行一项任务,或者在一段延时之后执行一项任务。Linux 时间函数Linux 的计时函数,用于获得当前时间:time(2) / time_t (秒)ftime(3) / struct timeb (毫秒)gettimeofday(2) / struct timeval (微秒)clock_gettime(2) / struct timespec (纳秒)gmtime / localtime / timegm / mktime / strftime / struct tm (这些与当前时间无关)定时
阅读全文
摘要:我写了一个服务器程序,在Linux下测试,然后用C++写了客户端用千万级别数量的短链接进行压力测试.但是服务器总是莫名退出,没有core文件.最后问题确定为, 对一个对端已经关闭的socket调用两次write, 第二次将会生成SIGPIPE信号, 该信号默认结束进程.具体的分析可以结合TCP的"四次握手"关闭. TCP是全双工的信道, 可以看作两条单工信道, TCP连接两端的两个端点各负责一条. 当对端调用close时, 虽然本意是关闭整个两条信道, 但本端只是收到FIN包. 按照TCP协议的语义, 表示对端只是关闭了其所负责的那一条单工信道, 仍然可以继续接收数据. 也
阅读全文
摘要:SIGHUP信号与控制终端UNIX中进程组织结构为session(会话)包含一个前台进程组及一个或多个后台进程组,一个进程组包含多个进程。一个session可能会有一个session首进程,而一个session首进程可能会有一个控制终端。一个进程组可能会有一个进程组首进程。进程组首进程的进程ID与该进程组ID相等。这儿是可能会有,在一定情况之下是没有的。与终端交互的进程是前台进程,否则便是后台进程。SIGHUP会在以下3种情况下被发送给相应的进程: 1、终端关闭时,该信号被发送到session首进程以及作为job提交的进程(即用 & 符号提交的进程) 2、session首进程退出时,该
阅读全文
摘要:用条件变量实现的一个简单的定时器,直接上代码吧#include #include #include #include #include #include void * tick( void * arg){ pthread_cond_t cond; pthread_mutex_t mutex; pthread_mutex_init( &mutex,NULL); pthread_cond_init( &cond,NULL); struct timespec to; int i = 0; pthread_mutex_lock( &mutex); to....
阅读全文
摘要:文件 Cache 管理是 Linux 内核中一个很重要并且较难理解的组成部分。本文详细介绍了 Linux 内核中文件 Cache 管理的各个方面,希望能够对开发者理解相关代码有所帮助。
阅读全文
摘要:简要介绍了linux操作系统的内核态和用户态的概念和基本原理。
阅读全文
摘要:本文介绍Linux中块设备文件和普通文件的区别。
阅读全文