linux编程
freshman94
这个作者很懒,什么都没留下…
展开
-
gcc 学习笔记
-Wall 显示所有的警告信息-Wall选项可以打开所有类型的语法警告,以便于确定程序源代码是否是正确的,并且尽可能实现可移植性。对Linux开发人员来讲,GCC给出的警告信息是很有价值的,它们不仅可以帮助程序员写出更加健壮的程序,而且还是跟踪和调试程序的有力工具。建议在用GCC编译源代码时始终带上-Wall选项,养成良好的习惯。-pedantic 以ANSI/ISO C标准列出的所有警告...原创 2019-03-24 19:37:43 · 467 阅读 · 0 评论 -
生产者消费者问题
问题描述:缓冲区大小为N,生产者产生物品放到缓冲区,消费者将物品从缓冲区移走互斥关系:对缓冲区得访问需要互斥,包括生产者和生产者之间、消费者和消费者之间、生产者和消费者之间。同步关系:当缓冲区满时生产者进程需要等待,当缓冲区空时消费者进程需要等待。解题思路:用信号量解决生产者消费者问题。互斥:有界缓冲区是一个临界资源,对临界资源得访问需要设置一个信号量mutex同步:设置两个同步信号量...原创 2019-04-12 19:27:28 · 781 阅读 · 0 评论 -
pkg-config的学习之路
简介pkg-config是编译应用程序和库时使用的辅助工具。它可以帮助我们在命令行中插入正确的编译器选项,以便应用程序可以使用诸如gcc -o test test.c `pkg-config --libs --cflags glibc-2.29`的命令,其中–cflags和–libs分别指定CFLAGS参数和库文件。这样我们就不必通过硬编码来找到glib(或其他库)。它与语言无关,因此可用于定义...原创 2019-04-03 15:57:10 · 609 阅读 · 0 评论 -
Linux多线程服务端编程学习(七):TCP客户端的设计
前文一般是由客户端主动发起连接,而主动发起连接就比被动接受连接要复杂一些,一方面是错误处理麻烦,另一方面是要考虑重试。发起连接的基本方式是调用connect,当socket变得可写时,表明连接建立完毕,但其中要处理各种错误,要判断连接是否建立成功。实现中我们将其封装为Connector类,需要注意的几个地方是:用于建立连接的socket是一次性的,一旦出错,就无法恢复,只能关闭重来。但Co...原创 2019-03-29 09:43:03 · 246 阅读 · 0 评论 -
程序执行完整过程
.c文件生成.exe文件的过程总共是经历了预处理,编译,汇编,链接,这四个过程。1、预处理第一步发生的是预编译,使用-E指令会使程序只进行到预编译指令。经过预编译指令后的会生成一个.i文件。在预编译的过程中,主要处理源代码中的预处理指令,引入头文件,去除注释,处理所有的条件编译指令(#ifdef),宏的替换,添加行号,保留所有的编译器指令。2、编译使用-S指令编译经过预处理的文件。编译...原创 2019-04-01 15:51:48 · 765 阅读 · 0 评论 -
Linux下的I/O模型
I/O模型的引出我们都知道,为了OS的安全性等的考虑,进程是无法直接操作I/O设备的,其必须通过系统调用请求内核来协助完成I/O动作,而内核会为每个I/O设备维护一个buffer。如下图所示: 一个输入操作分为两个阶段:(1) 等待数据准备好;(2)从内核向进程复制数据 在整个请求过程中,数据输入至buffer需要时间,而从buffer复制数据至进程也需要时间。因此根据在这两段...原创 2019-04-01 12:03:06 · 127 阅读 · 0 评论 -
Linux多线程服务端编程学习(八):压力测试
本篇文章将测试网络库的吞吐量和并发事件处理效率,源码的地址为:https://github.com/freshman94/NetLib用ping pong协议测试网络库在单机上的吞吐量简单地说,ping pong协议是客户端和服务器都实现echo协议。当TCP连接建立时,客户端向服务端发送一些数据,服务器会echo回这些数据,然后客户端再echo回服务器。这些数据就会像乒乓球一样在客户端和服务...原创 2019-04-01 11:02:53 · 412 阅读 · 0 评论 -
GUARDED_BY(c) 和 PT_GUARDED_BY(c)
GUARDED_BY是一个应用在数据成员上的属性,它声明了数据成员被给定的监护权保护。对于数据的读操作需要共享的访问权限,而写操作需要独占的访问权限。PT_GUARDED_BY与之类似,只不过它是为指针和智能指针准备的。对数据成员(指针)本身没有任何限制,它保护的是指针指向的数据。...原创 2019-04-04 16:57:32 · 3613 阅读 · 0 评论 -
C/C++知识小记
glibcglibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。syscall()syscall() 执行一个系统调用,根据指定的参数number和所有系统调用的汇编语言接口来确定调用哪个系统调用。例子:获取线程ID,gettid()#include <sys/syscall.h>tid = sy...原创 2019-04-04 16:47:33 · 248 阅读 · 0 评论 -
Linux多线程服务端编程学习(六):基于timerfd实现定时器
本篇文章源码的地址为:https://github.com/freshman94/NetLib在这一节中,我们会实现一个定时器,为反应器EventLoop增加定时回调函数的功能。实现定时器的关键类有:TimerTimerQueueTimer类Timer实现了一个定时器结点,其核心成员变量为: const TimerCallback callback_; Timestamp exp...原创 2019-03-26 20:47:43 · 569 阅读 · 0 评论 -
时间函数与定时器timerfd
时间结构体struct timeval{__time_t tv_sec; //Seconds.__suseconds_t tv_usec; //Microseconds.};struct timespec {time_t tv_sec; // secondslong tv_nsec; // nanoseconds};struct tm { int t...原创 2019-03-26 19:09:43 · 869 阅读 · 1 评论 -
gcc的原子操作
原子操作__sync_系列提供加减和逻辑运算的原子操作type __sync_fetch_and_add (type *ptr, type value, ...)type __sync_fetch_and_sub (type *ptr, type value, ...)type __sync_fetch_and_or (type *ptr, type value, ...)type __...原创 2019-03-25 21:31:32 · 8637 阅读 · 0 评论 -
常用的gdb命令
step < count>单步跟踪,如果有函数调用,他会进入该函数。进入函数的前提是,此函数被编译有debug信息。很像VC等工具中的step in。后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。next < count>同样单步跟踪,如果有函数调用,他不会进入该函数。很像VC等工具中的step over。后面可以...原创 2019-03-24 19:43:11 · 204 阅读 · 0 评论 -
Linux调试分析诊断利器——strace
转载https://www.cnblogs.com/clover-toeic/p/3738156.htmlstrace是个功能强大的Linux调试分析诊断工具,可用于跟踪程序执行时进程系统调用(system call)和所接收的信号,尤其是针对源码不可读或源码无法再编译的程序。在Linux系统中,用户程序运行在一个沙箱(sandbox)里,用户进程不能直接访问计算机硬件设备。当进程需要访问硬件...转载 2019-04-16 11:27:25 · 184 阅读 · 0 评论