Linux C
进哥说Java面试
这个作者很懒,什么都没留下…
展开
-
深入剖析nginx时间缓存
在服务器开发领域,时间的准确度关系到系统能否正常运行,尤其是当系统中存在超时事件需要处理时。但是系统时间的获取需要一次昂贵的系统调用,作为一款成熟的服务器软件,Nginx是如何优化这部分的性能开销?原创 2017-08-07 09:57:17 · 920 阅读 · 0 评论 -
转换C文件中的tab为空格的三种方法
将linux文件中的tab更换为空格的三种方法1,用sed命令#sed ‘s/\t/ /g’ filename >filename12, 用tr命令#cat filename|tr "\t" " " >filename23,用col -x命令#cat filename|col -x >filename2 linux命令col用法详转载 2015-06-14 22:25:02 · 1933 阅读 · 1 评论 -
Linux Futex浅析
Futex,Fast Userspace muTEXes,作为linux下的一种快速同步(互斥)机制,已经存在了很长一段时间了(since linux 2.5.7)。它有什么优势?又提供了怎样一些功能,本文就简单探讨一下。 futex诞生之前在futex诞生之前,linux下的同步机制可以归为两类:用户态的同步机制 和 内核同步机制。 用户态的同步机制基本上就是利用转载 2015-05-06 12:25:03 · 2728 阅读 · 0 评论 -
多线程死锁调试小技巧
据说再高的高手在写多线程程序的时候都难确保不会产生死锁,死锁的调试也就成为一个比较常见的问题,假设有下面这样一个问题: 一个正在生产环境下运行的进程死锁了,或者你只是在跑一个程序,并没有在调试器里面打开它,然后发现没有响应,日志输出也停止了。由于你是一个有经验的程序员,会想到“我刚刚加上了新的锁策略,不一定稳定,这可能是死锁了“。但是你不想就这么杀掉进程,因为多线程的 bug 不容易重现转载 2015-05-05 21:06:15 · 843 阅读 · 0 评论 -
const在c/c++中的区别
C++中的const正常情况下是看成编译期的常量,编译器并不为const分配空间,只是在编译的时候将期值保存在名字表中,并在适当的时候折合在代码中.所以,以下代码:#include using namespace std;int main(){ const int a = 1; const int b = 2; int array[ a + b ] = {0}; f转载 2015-04-04 20:57:30 · 593 阅读 · 0 评论 -
Linux C自定义内存泄露检测
最近在写个博客爬虫时用mtrace检测时总出现内存泄露,但有些地方的显示信息查看起来不方便,于是顺手写了个内存泄露检测的代码,比较简陋,只涵盖了malloc、free和strdup函数,本想着glibc已经向用户程序提供了malloc钩子,但钩子函数无法直接打印出调用函数及行号等信息,改用宏定义函数实现如下:int nmallocs = 0, nfrees = 0;#define debug原创 2015-01-23 17:01:50 · 759 阅读 · 0 评论 -
常见的I/O模型及其区别
首先,介绍几种常见的I/O模型及其区别,如下:blocking I/Ononblocking I/OI/O multiplexing (select and poll)signal driven I/O (SIGIO)asynchronous I/O (the POSIX aio_functions)blocking I/O 这个不用多解转载 2014-12-30 20:25:03 · 1746 阅读 · 0 评论 -
Reactor VS Proactor
两种I/O多路复用模式:Reactor和Proactor 一般地,I/O多路复用机制都依赖于一个事件多路分离器(Event Demultiplexer)。分离器对象可将来自事件源的I/O事件分离出来,并分发到对应的read/write事件处理器(Event Handler)。开发人员预先注册需要处理的事件及其事件处理器(或回调函数);事件分离器负责将请求事件传递给事件处理器。两个与事件分离转载 2014-12-30 21:01:28 · 773 阅读 · 0 评论 -
pthread_cond_wait的spurious wakeup问题
最近在温习pthread的时候,忽然发现以前对pthread_cond_wait的了解太肤浅了。昨晚在看《Programming With POSIX Threads》的时候,看到了pthread_cond_wait的通常使用方法:pthread_mutex_lock();while(condition_is_false) pthread_cond_wait();pthread_m转载 2015-02-04 09:48:24 · 682 阅读 · 0 评论 -
嵌入式操作系统VxWorks中网络协议存储池原理及实现
嵌入式操作系统VxWorks中网络协议存储池原理及实现周卫东 蔺妍 刘利强(哈尔滨工程大学自动化学院,黑龙江 哈尔滨,150001) 摘 要 本文讨论了网络协议存储池的基本原理和在嵌入式操作系统中的实现方法。为在嵌入式系统中实现TCP/IP协议栈,提供了一种有效、简洁、可靠的缓冲区管理。关键词 VxWorks; mBlk; clBlk; 网络协议存储池转载 2015-06-15 14:43:43 · 994 阅读 · 0 评论 -
详解coredump
一,什么是coredump 我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下(这里为什么说需要满足一定的条件呢?下面会分析)会产生一个叫做core的文件。 通常情况下,core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函转载 2015-09-17 21:07:53 · 537 阅读 · 0 评论 -
tcp和udp的0字节数据
网上许多博客讨论了tcp和udp的0字节数据问题,如http://blog.csdn.net/wzx19840423/article/details/66430941、tcp和udp都能发送0字节的数据包,windows下通过GetLastError查看返回值为02、tcp发送0字节的数据包后,接收方调用recv不会接收到该数据包3、udp发送0字节的数据包后,接收方调用recvfro原创 2016-04-08 15:40:29 · 2702 阅读 · 0 评论 -
Nginx最新模块—ngx_http_mirror_module分析
最近nginx官网公布了nginx1.13.4最新的ngx_http_mirror_module模块,利用mirror模块,业务可以将线上实时访问流量拷贝至其他环境,基于这些流量可以做版本发布前的预先验证,进行流量放大后的压测等等。本着兴趣笔者调研了其实现原理和使用方式,通过demo的形式展示给读者,希望能解决大家在使用过程中遇到的问题。原创 2017-08-11 10:58:36 · 6014 阅读 · 0 评论 -
深入剖析nginx平滑重启
在服务器开发过程中,难免需要重启服务加载新的代码或配置,如果能够保证server重启的过程中服务不间断,那重启对于业务的影响可以降为0。最近调研了一下nginx平滑重启,觉得很有意思,记录下来供有兴趣的同学查阅。原创 2017-07-16 20:04:48 · 10347 阅读 · 1 评论 -
高效线程池之无锁化实现(Linux C)
无锁化线程池实现原创 2015-05-19 15:02:47 · 11952 阅读 · 2 评论 -
未释放互斥锁线程退出
#include #include pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;void *f(void *args){ pthread_mutex_lock(&mutex); printf("lock in f without unlock!\n"); return NULL;}原创 2016-09-17 18:31:35 · 3715 阅读 · 0 评论 -
动态hash算法实现
动态hash算法实现原创 2016-06-12 12:54:21 · 6767 阅读 · 0 评论 -
ptrace运行原理及使用详解
你想过怎么实现对系统调用的拦截吗?你尝试过通过改变系统调用的参数来愚弄你的系统kernel吗?你想过调试器是如何使运行中的进程暂停并且控制它吗?你可能会开始考虑怎么使用复杂的kernel编程来达到目的,那么,你错了。实际上Linux提供了一种优雅的机制来完成这些:ptrace系统函数。 ptrace提供了一种使父进程得以监视和控制其它进程的方式,它还能够改变子进程中的寄存器和内核映像,因而转载 2016-05-08 10:34:23 · 959 阅读 · 0 评论 -
项目Makefile书写示例(二)
之前介绍了项目Makefile的写法,详见http://blog.csdn.net/xhjcehust/article/details/51096924链接主要讲述的是单个目录下的Makefile写法,本文在此基础上介绍多目录的Makefile写法,目录结构为:在cli、exp、trig子目录下的文件分别为:文件之间的关系为exp和trig下的文件inc原创 2016-04-10 08:39:34 · 436 阅读 · 0 评论 -
项目Makefile书写示例(一)
现有如下文件目录,需要构建Makefile文件。文件之间的依赖关系为:需要生成目标文件为indexer queryone printindex query所有.o文件都依赖于freq_list.h queryone、worker、query还依赖于worker.h按照常规写法,先编译生成.o文件,再链接生成目标执行文件写出的Makefile为:# Makefil原创 2016-04-08 15:22:08 · 484 阅读 · 0 评论 -
Lock Convoys Explained
Lock Convoys是在多线程并发环境下由于锁的使用而引起的性能退化问题。当多个相同优先级的线程频繁地争抢同一个锁时可能会引起lock convoys问题,一般而言,lock convoys并不会像deadlock或livelock那样造成应用逻辑停止不前,相反地,遭受lock convoys的系统或应用程序仍然往前运行,但是,由于线程们频繁地争抢锁而导致过多的线程环境切换,从而使得系转载 2015-02-04 09:26:40 · 596 阅读 · 0 评论 -
Linux C 编程内存泄露检测工具(一):mtrace
前言所有使用动态内存分配(dynamic memory allocation)的程序都有机会遇上内存泄露(memory leakage)问题,在Linux里有三种常用工具来检测内存泄露的情況,包括:mtracedmallocmemwatch1. mtracemtrace是三款工具之中是最简单易用的,mtrace是一个C函數,在里声明及定义,函数原型为转载 2014-12-24 09:14:41 · 992 阅读 · 1 评论 -
僵死进程与孤儿进程
在Unix系统编程中,常常会碰到两个概念:僵死进程和孤儿进程。话说我以前曾经把这两个概念弄混淆过。什么是僵死进程?我们知道,在Unix进程模型中,进程是按照父进程产生子进程,子进程产生子子进程这样的方式创建出完成各项相互协作功能的进程的。当一个进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。如果父进程没有这么做的话,会产生什么后果转载 2014-06-30 14:36:19 · 619 阅读 · 0 评论 -
链表翻转
#include #include struct Node {int value;struct Node *next;}; struct Node * reverse(struct Node *head) {if(!head)return NULL; struct Node *pt = head; struct Node原创 2014-06-03 20:54:29 · 709 阅读 · 0 评论 -
mac地址转换
#define mac_to_u64(mac) \()(((u64)mac[0] ((u64)mac[2] ((u64)mac[4] #define u64_to_mac(num, mac) \do {\mac[0] = ((u8 *)&num)[5]; \mac[1] = ((u8 *)&num)[4]; \mac[2] = ((u8 *)&num)[3]原创 2014-05-01 23:22:34 · 2055 阅读 · 2 评论 -
命名管道(FIFO)聊天程序
{CSDN:CODE:202}{CSDN:CODE:201}原创 2013-07-20 00:32:10 · 1543 阅读 · 0 评论 -
netlink 用户空间与内核空间通信实例
//net_link.c for kernel space#include #include #include #include #include #include #define NETLINK_TEST 17 //we also should "define NETLINK_TEST 17 "in include/linux/netlink.hs原创 2013-12-17 16:13:30 · 965 阅读 · 0 评论 -
udp s c
#include #include #include #include #include #include #include #include #include int port =9000;int main(){ int sockfd,len,z; char buf[256]; struct sockaddr_in adr_inet;原创 2013-12-09 22:57:24 · 785 阅读 · 0 评论 -
信号量 互斥锁 条件变量的区别
转自:http://blog.chinaunix.net/u3/108685/showart_2127853.html信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在哪里)。而互斥锁是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可转载 2013-07-20 10:06:47 · 841 阅读 · 0 评论 -
生产者——消费者问题
#include #include #include struct msg{ struct msg *next; int num;};struct msg *head;pthread_cond_t has_product=PTHREAD_COND_INITIALIZER;pthread_mutex_t lock=PTHREAD_MUTEX_INITIALIZER;v原创 2013-07-20 00:02:12 · 932 阅读 · 0 评论 -
C语言的inline
C语言的inlineC语言的inline转以前我用Docbook写的一篇关于C语言inline关键字使用的文章。唉,要是能用docbook直接写Blog就好了。用得越多发现Docbook这个东西真是越好用啊~~ 本文介绍了GCC和C99标准中inline使用上的不同之处。inline属性在使用的时候,要注意以下两点:inline关键字在GCC参考文档转载 2014-07-27 19:19:17 · 685 阅读 · 0 评论 -
子进程继承父进程中的锁
fork函数调用会创建子进程,子进程的地址空间是在调用fork时父进程地址空间的拷贝。因为子进程地址空间跟父进程一样,所以调用fork时,子进程继承了父进程中的所有互斥锁、读写锁和条件变量(包括它们的状态)。 但在多线程环境中,调用fork时,子进程中只有一个线程存在,这个线程是调用fork函数的那个线程,其他线程都没有被拷贝。 根据上述两点,子进程中的锁可能被不存在的转载 2014-07-12 20:58:50 · 4513 阅读 · 0 评论 -
.PHONY makefile中的伪目标
我的理解: 拿clean举例,如果make完成后,自己另外定义一个名叫clean的文件,再执行make clean时,将不会执行rm命令。 为了避免出现这个问题,需要.PHONY: clean ====================================================================================转载 2014-09-28 08:42:22 · 669 阅读 · 0 评论 -
Linux中线程与CPU核的绑定
不管是线程还是进程,都是通过设置亲和性(affinity)来达到目的。对于进程的情况,一般是使用sched_setaffinity这个函数来实现,网上讲的也比较多,这里主要讲一下线程的情况。 与进程的情况相似,线程亲和性的设置和获取主要通过下面两个函数来实现:int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize,转载 2014-12-09 09:02:25 · 865 阅读 · 0 评论 -
Linux内存管理
一提到内存管理,我们头脑中闪出的两个概念,就是虚拟内存,与物理内存。这两个概念主要来自于linux内核的支持。Linux在内存管理上份为两级,一级是线性区,类似于00c73000-00c88000,对应于虚拟内存,它实际上不占用实际物理内存;一级是具体的物理页面,它对应我们机器上的物理内存。这里要提到一个很重要的概念,内存的延迟分配。Linux内核在用户申请内存的时候,只是给它分配转载 2014-12-23 22:21:35 · 708 阅读 · 0 评论 -
C语言正则表达式
标准的C和C++都不支持正则表达式,但有一些函数库可以辅助C/C++程序员完成这一功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库,许多Linux发行版本都带有这个函数库。C语言处理正则表达式常用的函数有regcomp()、regexec()、regfree()和regerror(),一般分为三个步骤,如下所示:转载 2015-01-11 22:24:53 · 827 阅读 · 0 评论 -
linux线程资源回收方法
在写网络服务器程序时可能需要实现多线程接收多个客户端的数据,我实现方式比较傻,死循环等待client的connect,connect之后创建thread,这样其实有一个问题,服务器程序需要长期运行,长时间线程的创建,线程资源的回收就是一个问题。Linux系统中程序的线程资源是有限的,表现为对于一个程序其能同时运行的线程数是有限的。而默认的条件下,一个线程结束后,其对应的资源不会被释放,于是转载 2014-12-06 16:35:10 · 919 阅读 · 0 评论 -
GNU C函数嵌套定义及闭包
最近无意中发现GNU C原来是支持函数嵌套定义的,于是想到函数嵌套定义的用处之一:闭包函数,不多说,代码如下:#include void *outer(int var){ void inner() { printf("inner %d\n", var); } printf("outer\n"); return &inner;}int main(){ void (原创 2014-12-20 20:14:29 · 1341 阅读 · 0 评论 -
linux lsof命令详解
简介lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因转载 2014-10-17 12:53:15 · 707 阅读 · 0 评论 -
I/O重定向和管道
I/O重定向重定向I/O的是shell而不是程序。下面的例子证明了shell并不将重定向标记和文件名传递给程序。#includemain(int argc,char *argv[]){ int i; printf("%d args:\n",argc); for(i=0;i){ printf("%s\n",argv[i]);转载 2014-10-14 21:55:40 · 731 阅读 · 0 评论