Linux系统/网络编程
文章平均质量分 80
mybright_
这个作者很懒,什么都没留下…
展开
-
Linux 进程状态
Linux 进程状态是平时排查问题、程序稳定性测试的基础知识,查看进程状态的常用工具有 top 和 ps。以 top 的输出为例:S 列(Status)表示进程的状态,图中可见 D、R、S 状态,实际工作中,你会遇到的状态还会很多,它们及代表意义如下:R:Running / Runnable,表示进程在 CPU 的就绪队列中,正在运行或正等待运行;D:Dick sleep,表示不可中断睡眠状态(Uninterruptible sleep),一般说明进程正跟硬件交互中,交互过程不允许被其他进程中断;原创 2022-05-12 08:00:00 · 2294 阅读 · 0 评论 -
Linux 平均负载
平均负载?如何理解?原创 2022-05-07 23:24:06 · 2267 阅读 · 0 评论 -
Linux CPU 使用率
CPU 使用率指的是以百分比的形式表示的单位时间内 CPU 使用情况。那它具体是怎么计算出来的,有哪些相关指标,这还得从 Linux 系统的时间片轮说起。1、Linux 时间片轮Linux 在宏观上可以在同时执行多个程序,但是从微观上看,一个 CPU 同一时问内是只能处理一个程序,那么在存在多个待执行程序的当下,系统如何公平处理?这就需要时间片轮来使得每个程序轮流执行。简单来说,时间片就是 CPU 分配给各个程序的时间,使得各个程序从表面上看是同时进行的。那一个时间片是多久,如何衡量呢?这就需要引入节拍原创 2022-04-27 20:47:48 · 3407 阅读 · 0 评论 -
服务端处理事件的两种模式--Reactor和Proactor
《Linux高性能服务器编程》阅读笔记: 服务端程序通常需要处理IO事件、信号(参考Linux系统上的信号 和Linux网络编程的相关信号)、定时器事件(参考定时器实现超时发送/接收和定期检测非活动连接),而Reactor(反射器模式)和Proactor(前摄器模式)正是服务端应对这些事件的两种高效处理模式。实现Reactor模式采用同步IO模型,实现Proactor模式则采用异步IO模型。原创 2018-01-14 00:03:09 · 2292 阅读 · 0 评论 -
定时器实现超时发送/接收和定期检测非活动连接
《Linux高性能服务器编程》阅读笔记:1. socket的发送/接收超时 在Linux网络编程基础–socket常用选项中讲道,socket选项SO_RCVTIMEO和SO_SNDTIMEO分别用来设置socket接收数据超时和发送数据超时时间,这两个选项仅对与数据接收/发送相关的socket系统调用都有效,具体如下: 在程序中上面的系统调用可以根据其返回值和errno来判断是否超时,进而原创 2018-01-04 18:54:30 · 3111 阅读 · 0 评论 -
Linux网络编程基础--socket常用选项
《Linux高性能服务器编程》阅读笔记: Linux系统中,有控制文件描述符属性的通用Posix系统调用fcntl(),还有两个专门用来读取和设置socket文件描述符属性的方法:#include <sys/types.h>#include <sys/socket.h>int getsockopt(int sockfd, int level, int optname,原创 2017-12-07 18:55:04 · 1035 阅读 · 1 评论 -
Linux网络编程的相关信号
《Linux高性能服务器编程》阅读笔记: SIGHUP、SIGPIPE和SIGURG是网络编程中密切相关的信号。 SIGHUP: SIGHUP信号的触发时机是在进程的控制终端被挂起,对于没有控制终端的网络后台程序来说,通常是利用SIGHUP信号来强制服务器程序重读相关的配置文件,一个典型的例子就是xinetd超级服务器程序。 SIGPIPE: 往读端关闭的管道或socket连接中写数据将会触发原创 2017-12-25 19:38:39 · 1485 阅读 · 1 评论 -
Linux系统上的信号
《Linux高性能服务器编程》阅读笔记: 信号机制就像单片机上的中断机制一样,中断机制需要一个中断源,同理,信号机制也需要信号源。信号的来源有: (1)用户:用户通过终端键入特殊字符(如ctrl+c,针对前台进程) (2)进程:运行kill命令或者kill()系统调用 (3)系统:系统异常(如浮点异常、访问非法内存)、系统状态发生变化(如alarm定时器引起SIGALARM信号)原创 2017-12-25 19:03:38 · 763 阅读 · 0 评论 -
Makefile基础
本文总结了makefile的概念及基础语法,不涉及makefire的内置函数。比较简单,是阅读、编写makefile基础。 1、makefile可以理解为是一门新的脚本语言,或者是一种工具,它专门用于编译:项目越庞大,代码文件越多,越能体现makefile的功能之强大。 2、makefile作为一门脚本语言,所以自然是属于解析型语言。解析型语言由解析器去解析成计算机所能识别的二...原创 2017-12-16 16:40:08 · 1386 阅读 · 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 · 1593 阅读 · 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 · 1997 阅读 · 0 评论 -
Linux网络编程基础API--socket地址API
1. 主机字节序和网络字节序1.1 大小端原理 网络通信使得数据从一个主机传递到另一个主机。然而在不同的的处理器在管理内存单元上的数据时,对需要存放在多个内存单元地址的某一数据的处理方式不尽相同,因此对数据的解析结果也不同。目前处理器数据处理类型有大端和小端两种方式。 小端(Little-endian)模式: 操作数的存放方式为高地址存放高字节。 大端(Big-endi...原创 2017-12-04 19:23:50 · 454 阅读 · 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 · 3199 阅读 · 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 · 787 阅读 · 0 评论 -
send()、sendto()和recv()、recvfrom()的使用
udp通讯中的sendto()需要在参数里指定接收方的地址/端口,recvfrom()则在参数中存放接收发送方的地址/端口,与之对应的send()和recv()则不需要如此,但是在调用send()之前,需要为套接字指定接收方的地址/端口(这样该函数才知道要把数据发往哪里),在调用recv()之前,可以为套接字指定发送方的地址/端口,这样该函数就只接收指定的发送方的数据,当然若不指定也可,该函数就可以原创 2017-05-11 15:39:38 · 22657 阅读 · 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 · 27228 阅读 · 4 评论 -
IO复用实现定时器技术
《Linux高性能服务器编程》阅读笔记: Linux系统的3组IO复用系统调用(参考select()和poll()、epoll机制)都带有超时参数timeout,即它们不单能处理IO事件和信号(统一事件源),还可以处理定时器超时事件。但是需要注意两点: (1)该系统调用既然能因为监听超时而返回,也就意味着能因为系统发来SIGALRM信号而返回。然而SIGALRM信号的产生可能是因为该系原创 2018-01-05 18:18:10 · 830 阅读 · 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 · 1353 阅读 · 0 评论 -
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 · 623 阅读 · 0 评论 -
Linux系统上的rsyslog服务
项目中运用到了syslog的远程打印,初次接触,抽空了解如下。Linux中用来实现日志功能的服务为rsyslog,在centOS5及更早版本中使用的是syslog,rsyslog是syslog的增强版本。rsyslog一般默认都会安装且设置为自动启动。服务控制命令为:$ service rsyslog restart(或start、stop)rsyslog的配置文件为/etc/rsyslo...原创 2019-01-30 11:32:55 · 3904 阅读 · 0 评论 -
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 · 1128 阅读 · 0 评论 -
Linux系统调用的原子性
1、原子(atomicity)操作的概念执行流程所要完成的各个动作是不可中断的操作就叫原子操作。所有系统调用都是以原子操作方式执行的,内核保证了某系统调用中所有步骤作为独立操作而一次性执行完毕,中间不会被其它线程、进程所中断。2、竞争状态竞争状态是指操作共享资源的两个进程或线程,其结果取决于一个无法预期的顺序,即这两个进程或线程获得CPU使用权的先后顺序。两个例子说明原子操作的重要性:3...原创 2018-12-01 20:55:26 · 3674 阅读 · 0 评论 -
UNIX/Linux历史简介
今天是2018年12月01日,我正式住入新租的房子。陆陆续续搬了一个星期的东西,倒不是因为东西多,只是太纵容自己的惰性了,这不能够!新的住处间隔旧住处只是差了一条街道,走楼梯8楼,虽然出入辛苦点,但是光线还算充足,性价比差强人意吧。今天还是公司研发部门每季度团建的日子,我们去爬了深圳塘朗山,还不错,这是我在深圳继莲花山、梧桐山后爬的第3座山,适合慵懒的程序员。晚饭就去吃佛山烧仙鸡、烤鱼等等,还不...原创 2018-12-01 20:39:19 · 2032 阅读 · 0 评论 -
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 · 860 阅读 · 0 评论 -
线程同步(Linux系统)
线程同步中的“同步”并不是指步调或者节奏一致,而是谁先执行、谁后执行的概念。CPU对多线程的调度,使得线程同步在多线程访问共享资源时尤为重要,线程同步也是多线程编程中的难点所在。在Linux系统中线程同步的主要实现手段有:互斥锁、读写锁、条件变量、信号量。1. 互斥锁互斥锁是线程同步最常见的技术手段,它也被称为互斥量,实质上它就是一个pthread_mutex_t类型的变量。相关的使用...原创 2018-06-04 23:31:17 · 454 阅读 · 0 评论 -
使用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 · 4359 阅读 · 3 评论 -
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 · 4517 阅读 · 3 评论 -
使用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 · 6499 阅读 · 3 评论 -
编程获取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 · 3094 阅读 · 5 评论 -
编程以获取/设置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 · 335 阅读 · 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 · 5265 阅读 · 0 评论 -
Linux环境下静态库和动态库
1. 库的引入 c/c++项目的源码文件的组成一般为.c/.cpp和.h文件,可能你写的函数要供其他人使用,但你不能把你写的源码提供给别人,库就很好的解决了这个问题。gcc的-c编译选项可以将c/c++源文件只编译不链接,即生成.o文件。.o文件和.c/.cpp文件实际上都是源代码文件,只是前者是二进制格式的(人眼无法识别其内容),后者是文本格式的(人眼可以识别其内容),对于计算机来说前者后...原创 2018-03-06 09:49:48 · 579 阅读 · 0 评论 -
TCP协议--TCP头部
《Linux高性能服务器编程》阅读笔记:1. TCP协议的概念 TCP和UDP是传输层的两个主要协议。TCP相对于UDP来说,是面向连接、字节流和可靠传输。 (1) 面向连接 使用TCP通信的双方必须先建立起连接,然后才能开始数据的读写。建立连接后双方的系统内核会为该连接分配必要的系统资源,用来管理连接的状态和传输在连接上的数据。TCP连接是全双工的,即双方的读写操作可以在同一连接上执行。原创 2017-11-25 17:19:10 · 11317 阅读 · 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 · 5039 阅读 · 1 评论 -
Linux IO多路复用之epoll机制
迄今为止,epoll是Linux操作系统中最优秀的多路复用机制,它是select和poll的增强版,是2.6内核版本才引进的机制。本文是通过学习网上相关文章,以及相关书籍后的笔记总结。1. 文件IO1.1 非阻塞IO(进程忙等,不断查询)设置某个文件I/O操作为非阻塞I/O,即相当于告诉内核,如果当前没有数据可操作将不阻塞当前进程,而是返回一个错误信息。使用非阻塞IO方式虽然不阻塞当前进程,但需要反原创 2017-07-06 12:19:09 · 2613 阅读 · 0 评论 -
线程互斥锁封装
Linux多线程程序设计中,互斥锁机制十分关键,它主要起到资源保护的作用。在某些场合,对锁的操作,锁的初始化、上锁、解锁和销毁,过程会显得较为繁琐,再比如,上了锁之后再函数退出后有没有解锁,然后又在其他线程企图上锁,这样就造成了死锁。对这些操作可用c++对其做了简单的封装: 类的构造函数上锁,类的析构函数则解锁。运用到c++的多态、纯虚函数和继承、封装的思想。 UML图: 代码...原创 2017-07-04 19:53:47 · 592 阅读 · 0 评论 -
Linux系统进程间通讯-信号
1. 进程间通讯各进程间在虚拟内存空间上是独立的,以32位的操作系统为例,虚拟空间是4G。程序开发过程中,创建进程一般都会涉及到进程间的通讯。前面学的,子进程可以通过exit()返回错误码(0-255)返回到父进程,父进程用wait()来接收。exit()返回错误码存在局限性,通讯不仅要是数据交互,还可以互相影响,如杀死进程命令”kill -9 进程PID”,kill是发信号之意,即给进程发送9信号原创 2017-04-26 11:37:29 · 449 阅读 · 0 评论 -
Linux系统调用dup()和dup2()
dup()和dup2()函数都可以用来复制一个文件描述符,原型为:int dup(int oldfd);int dup2(int oldfd, int newfd);函数执行成功返回新的文件描述符,失败则返回-1。 dup()函数返回的新的文件描述符是当前可用文件描述符中最小数值,示例代码:int main(void){ int fd; int new_fd; fd =原创 2017-04-25 19:03:44 · 11093 阅读 · 0 评论 -
Linux操作系统的进程组、会话
1. 进程程序是指的存储在存储设备上包含了可执行机器指令和数据的静态实体,可执行指令即二进制代码。进程是已经被操作系统从存储设备加载到内存,动态运行的指令和数据的集合,是运行中的动态实体。2. 进程组每个进程除了有一个进程ID、父进程ID外,它还有一个进程组ID,标识它属于一个进程组。进程组是一个或者多个进程的集合。这些进程并非孤立,它们之间或者是父子进程,或者功能有相近的联系。每个进程都有父进程,原创 2017-04-25 11:08:20 · 1161 阅读 · 0 评论 -
进程退出函数exit()
在多进程编程中(这里讲Linux平台),某个进程函数退出时调用exit()函数。它是属于标准库的函数,原型void exit(int status);参数status是退出状态码,它可由用户自定义。为避免子进程成为僵尸进程,父进程是调用wait()或者waitpid()来获取子进程的退出状态。父进程的wait()(或者waitpid())结合子进程的exit()可以得到: 1) 子进程是否正常退出原创 2017-04-24 10:03:23 · 3436 阅读 · 0 评论