Linux编程
文章平均质量分 74
记录、分享LINUX操作系统上的应用编程及网络编程。
mybright_
这个作者很懒,什么都没留下…
展开
-
写在2019年来临前的倒数0.5小时
本来这篇文章是晚饭前要发表的,想完整的把system()函数和Linux系统上的信号梳理清晰,不料傍晚有点事情离开了一会儿,回来后又在楼下换了个新发型,耽误了好多时间,回来时已经是11点了。迅速洗澡洗衣服,把中午写到一段落的这篇文章发表出来:这是2018年最后1篇博文,先把system()基础梳理清晰,然后2019的第1篇文章就继续system()和信号的关系。匆匆2018年就这样要过去了,...原创 2018-12-31 23:43:36 · 1670 阅读 · 5 评论 -
system函数与信号
使用在写在2019年来临前的倒数0.5小时的system_test()函数来调用如下loop_echo程序:#include <stdio.h>#include <string.h>#include <signal.h>#define BUFSZ 1024static void handler(int sig){ printf("<.q&...原创 2019-01-16 19:23:46 · 1110 阅读 · 0 评论 -
UNIX/Linux历史简介
今天是2018年12月01日,我正式住入新租的房子。陆陆续续搬了一个星期的东西,倒不是因为东西多,只是太纵容自己的惰性了,这不能够!新的住处间隔旧住处只是差了一条街道,走楼梯8楼,虽然出入辛苦点,但是光线还算充足,性价比差强人意吧。今天还是公司研发部门每季度团建的日子,我们去爬了深圳塘朗山,还不错,这是我在深圳继莲花山、梧桐山后爬的第3座山,适合慵懒的程序员。晚饭就去吃佛山烧仙鸡、烤鱼等等,还不...原创 2018-12-01 20:39:19 · 1995 阅读 · 0 评论 -
编程以获取/设置Linux系统的网络信息
说明:文章代码整理自网上其它资料。1. 获取IP地址、子网掩码地址、Mac地址、广播地址#include <stdio.h>#include <string.h>#include <net/if.h>#include <sys/ioctl.h>#include <arpa/inet.h>#include <...转载 2018-04-19 14:30:45 · 328 阅读 · 0 评论 -
编程获取cpu、内存和硬盘的使用率
说明:文章代码整理自网上资料。1. 获取cpu使用率#include <stdio.h>#include <unistd.h>/* cpu_info_t结构体存放cpu相关信息 */typedef struct _cpu_info{ char name[20]; unsigned int user; unsigned int...转载 2018-04-19 14:44:34 · 3076 阅读 · 5 评论 -
使用VisualStudio2017开发Linux/c++程序(上)
环境 Windows10_x64 CentOS7_64(虚拟机)1、 Windows系统中安装VisualStudio2017 2、 Linux系统中安装gcc、g++和gdbserver 3、 创建Linux/c++项目 3.1创建app_test解决方案 3.2 添加新建项目main 这样vs2017会自动生成main.cpp文件。点击“生成”-...原创 2018-05-11 18:01:46 · 6458 阅读 · 3 评论 -
使用VisualStudio2017开发Linux/c++程序(下)
基于前面的环境及工程构建解决方案:主程序 + 静态库 + 动态库,并在主程序中调用静态库和动态库的函数。(参照文章https://www.cnblogs.com/dongc/p/6599461.html和http://www.mamicode.com/info-detail-1983443.html)一、创建解决方案1、右键解决方案->添加->新建项目 2、 右键stat...原创 2018-05-14 11:48:11 · 4332 阅读 · 3 评论 -
ubuntu1404上搭建c++和MySQL开发环境
MySQL数据库编程技术是Linux c++程序员必备技能。本文将在虚拟机的ubuntu1404环境上搭建MySQL的开发环境,内容涉及: MySQL服务端和客户端安装 MySQL编程的简单测试 参考文章: https://my.oschina.net/u/3818901/blog/1785667 https://blog.csdn.net/qq_25730711/...原创 2018-06-01 15:45:51 · 827 阅读 · 0 评论 -
线程同步(Linux系统)
线程同步中的“同步”并不是指步调或者节奏一致,而是谁先执行、谁后执行的概念。CPU对多线程的调度,使得线程同步在多线程访问共享资源时尤为重要,线程同步也是多线程编程中的难点所在。在Linux系统中线程同步的主要实现手段有:互斥锁、读写锁、条件变量、信号量。1. 互斥锁互斥锁是线程同步最常见的技术手段,它也被称为互斥量,实质上它就是一个pthread_mutex_t类型的变量。相关的使用...原创 2018-06-04 23:31:17 · 442 阅读 · 0 评论 -
popen函数代替system函数
system()函数的原型为:int system(const char *command);函数的返回值表示system()函数调用的执行结果,成功返回0,失败返回-1并设置errno为错误代码。需要注意的是该函数并不能获取command命令的执行结果。tmp.txt的内容为:helloworld#include <stdlib.h>#include &...原创 2018-04-27 16:46:02 · 4383 阅读 · 3 评论 -
gdb调试的常用命令
gcc a.c b.c -o app -g -g:会保留函数名和变量名于app中1、 启动gdb调试功能 (1)gdb app (2)给程序传参:set args xx1 xx22、 查看代码(list/l) (1)查看当前文件:ll 行号l 函数名(2)查看非当前文件:l 文件名:行号l 文件名:函数名(3)设置显示的行数set ...原创 2018-03-15 10:12:44 · 608 阅读 · 0 评论 -
Linux下/var/run/目录下的pid文件
参考文章Linux下/var/run目录下的pid文件作用。linux系统中/var/run/目录下的*.pid文件是一个文本文件,其内容只有一行,即某个进程的PID。.pid文件的作用是防止进程启动多个副本,只有获得特定pid文件(固定路径和文件名)的写入权限(F_WRLCK)的进程才能正常启动并将自身的进程PID写入该文件,其它同一程序的多余进程则自动退出。编程实现: 调用fcntl...原创 2018-04-10 08:55:16 · 5185 阅读 · 0 评论 -
定时器实现超时发送/接收和定期检测非活动连接
《Linux高性能服务器编程》阅读笔记:1. socket的发送/接收超时 在Linux网络编程基础–socket常用选项中讲道,socket选项SO_RCVTIMEO和SO_SNDTIMEO分别用来设置socket接收数据超时和发送数据超时时间,这两个选项仅对与数据接收/发送相关的socket系统调用都有效,具体如下: 在程序中上面的系统调用可以根据其返回值和errno来判断是否超时,进而原创 2018-01-04 18:54:30 · 3044 阅读 · 0 评论 -
服务端处理事件的两种模式--Reactor和Proactor
《Linux高性能服务器编程》阅读笔记: 服务端程序通常需要处理IO事件、信号(参考Linux系统上的信号 和Linux网络编程的相关信号)、定时器事件(参考定时器实现超时发送/接收和定期检测非活动连接),而Reactor(反射器模式)和Proactor(前摄器模式)正是服务端应对这些事件的两种高效处理模式。实现Reactor模式采用同步IO模型,实现Proactor模式则采用异步IO模型。原创 2018-01-14 00:03:09 · 2254 阅读 · 0 评论 -
Linux环境下静态库和动态库
1. 库的引入 c/c++项目的源码文件的组成一般为.c/.cpp和.h文件,可能你写的函数要供其他人使用,但你不能把你写的源码提供给别人,库就很好的解决了这个问题。gcc的-c编译选项可以将c/c++源文件只编译不链接,即生成.o文件。.o文件和.c/.cpp文件实际上都是源代码文件,只是前者是二进制格式的(人眼无法识别其内容),后者是文本格式的(人眼可以识别其内容),对于计算机来说前者后...原创 2018-03-06 09:49:48 · 570 阅读 · 0 评论 -
IO复用实现定时器技术
《Linux高性能服务器编程》阅读笔记: Linux系统的3组IO复用系统调用(参考select()和poll()、epoll机制)都带有超时参数timeout,即它们不单能处理IO事件和信号(统一事件源),还可以处理定时器超时事件。但是需要注意两点: (1)该系统调用既然能因为监听超时而返回,也就意味着能因为系统发来SIGALRM信号而返回。然而SIGALRM信号的产生可能是因为该系原创 2018-01-05 18:18:10 · 800 阅读 · 0 评论 -
Linux网络编程的相关信号
《Linux高性能服务器编程》阅读笔记: SIGHUP、SIGPIPE和SIGURG是网络编程中密切相关的信号。 SIGHUP: SIGHUP信号的触发时机是在进程的控制终端被挂起,对于没有控制终端的网络后台程序来说,通常是利用SIGHUP信号来强制服务器程序重读相关的配置文件,一个典型的例子就是xinetd超级服务器程序。 SIGPIPE: 往读端关闭的管道或socket连接中写数据将会触发原创 2017-12-25 19:38:39 · 1404 阅读 · 1 评论 -
Linux系统上的信号
《Linux高性能服务器编程》阅读笔记: 信号机制就像单片机上的中断机制一样,中断机制需要一个中断源,同理,信号机制也需要信号源。信号的来源有: (1)用户:用户通过终端键入特殊字符(如ctrl+c,针对前台进程) (2)进程:运行kill命令或者kill()系统调用 (3)系统:系统异常(如浮点异常、访问非法内存)、系统状态发生变化(如alarm定时器引起SIGALARM信号)原创 2017-12-25 19:03:38 · 683 阅读 · 0 评论 -
编写简单通用makefile
在Makefile基础中总结了makefile最常用的基础,利用这些知识点,足矣编写通用makefile运用于c/c++项目中。本文基于这样的文件编写makefile: 编写makefile需要实现: (1) 将bank.cpp编译成静态库bank.a/动态库bank.so; (2) 将bank.a和bank.so拷贝/opt/lib目录下; (3) 将bank.h拷贝原创 2017-12-16 21:57:51 · 1329 阅读 · 0 评论 -
Makefile基础
本文总结了makefile的概念及基础语法,不涉及makefire的内置函数。比较简单,是阅读、编写makefile基础。 1、makefile可以理解为是一门新的脚本语言,或者是一种工具,它专门用于编译:项目越庞大,代码文件越多,越能体现makefile的功能之强大。 2、makefile作为一门脚本语言,所以自然是属于解析型语言。解析型语言由解析器去解析成计算机所能识别的二...原创 2017-12-16 16:40:08 · 1250 阅读 · 0 评论 -
Linux IO复用--epoll机制
《Linux高性能服务器编程》阅读笔记:1. epoll机制的相关函数 epoll和select()、poll()不同,select()和poll()是通过该函数(单个)实现IO复用,而epoll用一组函数来实现IO复用。epoll把用户关心的文件描述符上的事件专门放在一个内核事件表(结构体)中,从而无须像select()和poll()那样每次调用都需要重复传入文件描述符集(如下poll()中的f原创 2017-12-12 18:45:08 · 754 阅读 · 0 评论 -
服务端基本框架和IO模型
《Linux高性能服务器编程》阅读笔记:1. 服务端基本框架 服务器的基本框架都是一样的: 不同之处在于逻辑的处理。不管是一台服务器还是一个服务器机群,以可以用上图描述: (1) I/O处理单元即管理客户连接的模块,负责: 等待并接受新的客户连接,接收客户数据,将服务端响应数据返回客户端。注意,数据的收发也不一定是在I/O处理单元执行,也可能在逻辑处理单元中执行,这取决于事件处理模式。对服原创 2017-12-11 18:31:25 · 970 阅读 · 0 评论 -
Linux IO复用--select()和poll()
《Linux高性能服务器编程》阅读笔记: Linux系统中IO复用的系统调用有selece()、poll()和epoll()。IO复用使得程序可以同时监听多个文件描述符的就绪事件的发生,应用场景如: (1) 服务端程序同时处理监听socket和连接socket (2) 服务端要同时处理TCP请求和UDP请求 (3) 服务端要同时监听多个端口或者处理多种服务请求 (4) 客户原创 2017-12-11 19:39:01 · 5004 阅读 · 1 评论 -
TCP/IP协议四层模型
接下来的学习重心会放在Linux网络编程这一块,我的博客也会随之更新。参照的书籍有《Linux高性能服务器编程》(游双著)、《UNIX网络编程-卷1:套接字联网API》。 TCP/IP协议族是一个四层协议系统:1. 数据链路层 1.1 作用 (1) 实现网卡接口的网络驱动,以处理数据在以太网线等物理媒介上的传输 (2) 网络驱动程序隐藏了不同物理网络的不同电气特性,为上层协议提供一个原创 2017-10-28 17:18:26 · 81216 阅读 · 0 评论 -
TCP/IP数据包封装与拆解概述
《Linux高性能服务器编程》阅读笔记:1. TCP/IP封包流程 (1) 经过TCP/UDP封装后的数据称为TCP报文段/UDP数据报。因为TCP协议除了会为通信双方维持一个连接,还具有超时重发的功能,所以操作系统会将APP的要发送数据存储在内核的相关数据结构中: 上图描述的是TCP发送数据时示意图,接收缓冲区也是如此。发送端APP调用系统调用send()/write()函数向TCP连接写数据原创 2017-10-30 19:46:21 · 27088 阅读 · 4 评论 -
ARP协议数据报
1. ARP协议简析 ARP是属于数据链路层的协议,它的作用在于将网络层任意协议中携带的地址转换为物理(MAC)地址,工作原理为: (1) 主机向自己所在的网络广播一个ARP请求数据报,该报含有目标机器的网络地址 (2) 所在网络上的其他机器都会收到这个请求,但只有目标机器才会回应ARP应答。应答数据报中包含了自身的物理地址 以基于以太网ARP请求/应答帧文为例: 以太网帧中的AR原创 2017-10-31 19:52:41 · 1720 阅读 · 0 评论 -
DNS协议概述
《Linux高性能服务器编程》阅读笔记:1. DNS工作原理 通常情况下我们要访问某个网站,使用的是该网站所在机器的域名,而不是直接使用其IP地址。将机器域名转换为IP地址的过程,这就需要域名查询服务。常见的域名查询服务有NIS(Network Information Service, 网络信息服务)、本地静态文件和DNS。 DNS是一套分布式的域名服务系统,即有多个DNS服务器遍布于世界。每个原创 2017-11-01 18:16:45 · 4428 阅读 · 0 评论 -
IP协议协议--IP头部信息
《Linux高性能服务器编程》阅读笔记:1. IP协议概述 IP协议是TCP/IP协议簇的核心,它为上层(传输层)协议(TCP/UDP)提供无状态、无连接、不可靠的服务。 (1) 无状态: IP通信双方的数据状态信息不同步,即所有的IP数据报的发送、传输、接收都是相互独立的,没有上下文关系。优点是简单高效,不占用内核结构来保存通信状态,每次传输数据时不用携带状态信息 (2) 无连接: IP原创 2017-11-18 18:13:07 · 32104 阅读 · 1 评论 -
IP协议协议--IP分片
《Linux高性能服务器编程》阅读笔记:1. IP分片的概念 如图,当IP数据报超过帧的MTU(最大传输单元)时,它将会被分片传输。分片能发生在发送端或者中转路由器,且在传输过程中可能被多次分片。在最后的目标机器上这些分片才会被内核的的IP模块重新组装。 在IPv4的头部信息中有3个字段专门为IP分片服务的: 一个IP数据报的每个分片都具有自己的IP头部信息,它们都具有相同的标识值,但是原创 2017-11-20 18:11:25 · 16778 阅读 · 3 评论 -
IP协议协议--IP路由
《Linux高性能服务器编程》阅读笔记: 简单来说,路由用于决定将数据报发送到目标机器的所经路径。它是IP协议的一个核心任务,即发生在TCP/IP四层模型中的网络层。确切的说,是发生在网络层的IP模块。1. IP模块工作流程 操作系统内核中的IP模块的工作流程如下图概括: 绿色箭头表示IP数据报的数据走向: (1) IP模块接收到来自数据链路层的IP数据报后,对其头部执行CRC校验,原创 2017-11-20 18:37:26 · 9216 阅读 · 0 评论 -
TCP协议--TCP头部
《Linux高性能服务器编程》阅读笔记:1. TCP协议的概念 TCP和UDP是传输层的两个主要协议。TCP相对于UDP来说,是面向连接、字节流和可靠传输。 (1) 面向连接 使用TCP通信的双方必须先建立起连接,然后才能开始数据的读写。建立连接后双方的系统内核会为该连接分配必要的系统资源,用来管理连接的状态和传输在连接上的数据。TCP连接是全双工的,即双方的读写操作可以在同一连接上执行。原创 2017-11-25 17:19:10 · 11148 阅读 · 0 评论 -
TCP协议--TCP连接的建立和关闭
《Linux高性能服务器编程》阅读笔记: TCP连接的建立和关闭,也就是常说的三次握手和四次挥手,其模型可以示意为: 我们可以利用tcpdump命令观察这个两个过程。机器1(telnet服务器):Ubuntu14.04 IP地址为192.168.239.136机器2(telnet客户端):Ubuntu11.04 IP地址为192.168.239.149 在Ubuntu14.04机器(te原创 2017-11-29 18:37:32 · 2503 阅读 · 0 评论 -
TCP协议--TCP连接的状态转移
《Linxu高性能服务器编程》阅读笔记:1. TCP服务端连接的状态转移 (1) 服务器调用listen()系统调用进入LISTEN(监听)状态,被动等待客户端连接。 (2) 服务端一旦监听到某个连接请求(收到同步报文段),就将该连接放入内核等待队列中,并向客户端发送带有SYN标志的确认报文段,此时服务端进入SYN_RCVD状态。 (3) 如果服务端成功接收到客户端发送回的确认报文段,就转移至原创 2017-11-30 19:33:03 · 1381 阅读 · 0 评论 -
TCP协议--复位报文段
《Linux高性能服务器编程》阅读笔记: 在某些特定的场合,TCP连接的一段会向另一端发送TCP头部信息携带RST标志的报文段,即复位报文段,以通知对方关闭连接或者重新建立连接。1. 访问不存在的端口 对于UDP协议,当一个数据报到达目的端口时,该端口没被监听使用,它将产生一个ICMP端口不可达的信息;对于TCP,目的主机将会产生一个复位报文段返回。 例如,在一台机器上登录目标机器的telne原创 2017-11-30 19:42:54 · 1191 阅读 · 0 评论 -
TCP协议--应用程序的数据交换
《Linux高性能服务器编程》阅读笔记: TCP报文段所携带的应用程序数据按照长度可分为2种: 交互数据和成块数据。交互数据仅包含很少的字节数据,使用交互数据的应用程序对实时性的要求高,如telnet、ssh等。成块数据的长度通常为TCP报文段允许的最大数据长度,使用成块数据的应用程序对传输效率要求高,如ftp。 下面分析一下比较简单的交互数据流: 使用telnet登录本机,并在shell原创 2017-12-01 18:19:56 · 1039 阅读 · 0 评论 -
TCP协议--带外数据和超时重传
《Linux高性能服务器编程》阅读笔记:1. 带外数据 有些传输层协议具有带外(Out Of Band, OOB)数据的概念,用于迅速告知对方本端发生的重要事件。因此带外数据比普通数据(也称为带内数据)有更高的优先级,不论发送缓冲区中是否有排队等待发送的普通数据,带外数据总是被立即发送。带外数据的传输可以使用一条独立的传输层连接,也可以映射到传输层普通数据的连接中。但是在实际应用中,带外数据的使用原创 2017-12-01 18:31:14 · 1819 阅读 · 0 评论 -
vim代码跳转工具ctags安装及使用
做Linux c/c++的开发,ctags是一个很有用的工具。结合vim编辑器,可以轻松跳转到变量/函数的定义处。在ubuntu上具体的安装使用步骤为: (1) 下载ctags工具$ sudo apt-get install ctags (2) 使用,以查看NULL的原型为例: NULL的定义肯定是在系统标准头文件中,即/usr/include和/usr/local/include。假设我原创 2017-12-04 18:17:34 · 3132 阅读 · 0 评论 -
Linux网络编程基础API--socket地址API
1. 主机字节序和网络字节序1.1 大小端原理 网络通信使得数据从一个主机传递到另一个主机。然而在不同的的处理器在管理内存单元上的数据时,对需要存放在多个内存单元地址的某一数据的处理方式不尽相同,因此对数据的解析结果也不同。目前处理器数据处理类型有大端和小端两种方式。 小端(Little-endian)模式: 操作数的存放方式为高地址存放高字节。 大端(Big-endi...原创 2017-12-04 19:23:50 · 443 阅读 · 0 评论 -
Linux网络编程基础API--socket文件描述符API
1. 创建socket Linux系统上”一切皆是文件“,socket也不例外,它是可读/可写/可控制/可关闭的文件描述符。要实现socket通信,双方都需要建立各自的socket对象。#include <sys/types.h> /* See NOTES */#include <sys/socket.h>int socket(int domain, int type, in原创 2017-12-05 19:33:58 · 1982 阅读 · 0 评论 -
Linux网络编程基础API--TCP的数据读写API
《Linux高性能服务器编程》阅读笔记:1. TCP通信的读写(收发)接口 因为”Linux系统上”一切皆是文件”,那么自然读写文件用的API read()/write()同样适用于socket。不过Linux还提供了几个专门用于socket数据读写的系统调用。#include <sys/types.h>#include <sys/socket.h>ssize_t recv(int sockf原创 2017-12-05 19:45:42 · 1533 阅读 · 0 评论