
Linux(程序设计)
文章平均质量分 91
董哥的黑板报
90后程序员!
展开
-
Linux(程序设计):01---程序编译原理(预处理、编译、汇编、链接)
一、程序编译原理程序编译一般分为四个步骤,最后生成一个可执行的文件: 第一步(预处理):在程序运行(main函数执行)之前,修改源码,主要处理代码中的#include头文件和#define宏定义代码(将程序运行时用到的#include头文件中的代码和#define宏定义的代码进行替换),最后生成一个.i文件(.i文件里面是替换代码之后的代码文件) 第二步(编译):此阶段会检查代码的规范...原创 2019-02-24 21:50:49 · 1087 阅读 · 0 评论 -
Linux(程序设计):02---make与Makefile的设计与应用
一、概念执行make命令时,需要一个Makefile文件,以告诉make命令需要怎么样的去编译和链接程序 Makefile是一个文本形式的数据库文件,其中包含一些规则来告诉make处理哪些文件以及如何处理这些文件Make是GNU的开源工具概念与Make的帮助文档见:http://www.gnu.org/software/make/二、特点因为Makefile就像一个Shel...原创 2019-03-05 15:08:53 · 969 阅读 · 0 评论 -
Linux(程序设计):03---GDB的使用(附GDB插件gef的下载安装)
一、启动GDB的三种方式①gdb <program> //program也就是可执行文件,一般在当前目录下 ②gdb <program> core //用gdb同时调试一个运行程序和core文件,core是该程序非法执行后core dump后产生的文件 ③gdb <program> PID //如果prog...原创 2019-03-06 14:23:54 · 1703 阅读 · 1 评论 -
Linux(程序设计):04---GDB的多进程、多线程调试
一、多进程的调试1.follow-fork-mod①意义:代表当前gdb跟随着哪个进程在调试 ②注意:follow-fork-mod默认情况下跟随着主线程调试(parent) ③查看当前gdb跟随着哪个线程在调试show follow-fork-mode③设置gdb跟随哪个线程调set follow-fork-mode parent //设置gdb跟随主线程调试(...原创 2019-03-12 17:22:36 · 902 阅读 · 1 评论 -
Linux(程序设计):05---gcc的基本用法
一、相关选项-c:编译生成目标文件(object file),即.o文件 -o:后面接文件名,用来指定gcc生成的文件名,如果没有-o,那么生成的是gcc默认的文件名 -g:产生符号调试工具(gdb)所必要的符号资讯(符号表),要想对源代码进行调试,就必须加入这个选项 -Wall:以最高级别使用GNU编译程序,专门用于显示警告信息 -O/-O1:对程序进行优化编译、链接,这样产生的可...原创 2019-03-18 20:31:18 · 833 阅读 · 0 评论 -
Linux(程序设计):06---动态函数库与静态函数库(ldconfig、ldd命令与/etc/ld.so.conf)
一、动态函数库(.a)扩展名:libxxx.a编译操作:这类函数库在编译的时候直接整合到执行程序当中,所以用静态函数库编译成的文件会比较大一些程序独立执行的状态:这类函数库最大的优点就是编译成功的可执行文件可以独立运行,不需要再向外部读取函数库的内容升级难易度:因为函数库直接整合到执行文件中,所以若函数库升级时,整个执行文件必须重新编译才能将新版的函数库整合到程序当中...原创 2019-03-19 13:50:09 · 603 阅读 · 1 评论 -
Linux(程序设计):08---perror、strerror函数(errno全局变量)
一、errno全局变量概念:只要有一个函数中有错误发生,全局变量errno就被设置为一个指明该错误类型的正值特点:头文件:#include<errno.h> errno的值只在函数发生错误时设置。如果函数不返回错误,errno的值就没有定义 errno的错误值都是整型常量,这些常量以'E'开头开头,定义在头文件<errno.h>中 errno的值对应着不同的...原创 2019-03-31 10:15:35 · 1083 阅读 · 0 评论 -
Linux(程序设计):09---UNIX系统数据类型
下面的这些数据类型都是UNIX的基本系统数据类型 这些数据类型都是由C语言的typedef定义而来的caddr_t 内存地址 clock_t 时钟滴答计数器 comp_t 压缩的时钟滴答 dev_t 设备号(主和次) fdse_t 文件描述符集 fpos_t 文件位置 gid_t 数值组ID ino_t i节点编号...原创 2019-03-31 13:52:03 · 533 阅读 · 0 评论 -
Linux(程序设计):10---字节操纵函数(bzero、bcopy、bcmp)
一、bzero功能:bzero把目标字符串中指定的数目的字节置为0#include <strings.h>void bzero(void *dest,size_t nbytes);参数:1.字符串 2.指定的字节二、bcopy功能:将指定数目的字节从源字符串移动到目标字符串中#include <strings.h>void bzero...原创 2019-04-08 21:53:31 · 1206 阅读 · 0 评论 -
Linux(程序设计):11---系统限制查询(sysconf、pathconf、fpathconf)
一、函数#include <unistd.h>long sysconf(int name);long fpathconf(int fd, int name);long pathconf(char *path, int name);与文件或目录无关的运行时限制:一般使用sysconf 与文件或目录有关的运行时限制:一般使用fpathconf、pathconf返回...原创 2019-05-08 16:44:21 · 652 阅读 · 0 评论 -
Linux(程序设计):12---选项查询(sysconf、pathconf、fpathconf)
#include <unistd.h>long sysconf(int name);long fpathconf(int fd, int name);long pathconf(char *path, int name);与文件或目录无关的运行时选项,一般使用sysconf 与文件或目录有关的运行时选项,一般使用fpathconf、pathconf一、返回值如果选...原创 2019-05-09 12:15:11 · 698 阅读 · 0 评论 -
Linux(程序设计):13---功能测试宏(_POSIX_C_SOURCE)
一、概念二、使用原创 2019-05-09 12:15:14 · 1942 阅读 · 1 评论 -
Linux(程序设计):14---结构成员定位宏offsetof
一、函数原型#include <stddef.h>size_t offsetof(type, member);参数:type:某种类型(结构体等) member:type类型结构中某一成员返回值:返回给定类型中给定成员的偏移量,以字节为单位二、注意事项这个宏很有用,因为组成结构的字段的大小在不同的实现中可能不同,编译器可能插入不同的数字。字段之间的填充...原创 2019-06-02 19:53:47 · 677 阅读 · 0 评论 -
Linux(程序设计):15---系统调用函数syscall
一、格式#define _GNU_SOURCE /* See feature_test_macros(7) */#include <unistd.h>#include <sys/syscall.h> /* For SYS_xxx definitions */int syscall(int number, ...);二、功能与特点sys...原创 2019-06-04 14:44:39 · 6425 阅读 · 1 评论 -
Linux(程序设计):16---sprintf、snprintf、sscanf
一、sprintf、snprintf#include <stdio.h>int sprintf(char *str, const char *format, ...);int snprintf(char *str, size_t size, const char *format, ...);sprintf功能:发送格式化输出到str所指向的字符串 返回值:成功...原创 2019-09-05 20:03:23 · 569 阅读 · 0 评论 -
Linux(程序设计):17---通用型Makefile设计案例
目的需求在目录下有一系列的.c文件,我们需要用这些.c文件进行链接,然后生成一个名为“helloworld” 针对需要生成的目标文件,我们会一步一步的对Makefile进行设计,最终形成一个通用型的Makefile一、Makefile-1设计helloworld:cerrexit.o connectsock.o connectTCP.o connectUDP.o dcon.o d...原创 2019-09-14 20:02:14 · 660 阅读 · 1 评论 -
Linux(程序设计):18---libmysqlclient-dev库(C语言操作MySQL)
一、C语言访问MySQL的前提①安装了MySQL服务端见文章:https://blog.youkuaiyun.com/qq_41453285/article/details/102638547②安装MySQL库使用C语言访问MySQL之前需要安装MySQL库,输入以下命令安装:#环境:Ubuntu 14.04sudo apt-get install libmysqlclient-...原创 2019-10-19 20:24:54 · 4986 阅读 · 1 评论 -
Linux(程序设计):19---main函数参数处理(getopt、getopt_long)
一、程序参数当一个用C语言编写的Linux或UNIX程序运行时,它是从main函数开始的。对这些程序而言,main函数的声明如下所示: argc:程序参数个数 argv:一个代表参数自身的字符串数组,argv[0]必为程序名,argv[1]开始才是程序的参数 int main(int argc,char *argv[])你可能也会看到Linux的C程序将main函数简单的声明为...原创 2019-10-20 17:24:21 · 876 阅读 · 0 评论 -
Linux(程序设计):20---时间处理(timespec、ctime、difftime、gmtime、clock_gettime、localtime、strftime、strptime)
格林尼治时间所有的UNIX系统都使用同一个时间和日期的起点:格林尼治时间(GMT)1970年1月1 日午夜(0点)。这是“UNIX纪元的起点”,Linux也不例外。Linux系统中所有的时间都以从那时起经过的秒数来衡量时间转换关系TZ环境变量在上图中,虚线表示的3个函数(localtime、mktime、strftime)受到环境变量TZ的影响 如果定义了TZ:则...原创 2019-10-20 22:24:34 · 2751 阅读 · 0 评论 -
Linux(程序设计):21---更改用户/组ID(setuid、setgid、setreuid、setregid、seteuid、setegid)
一、获取用户ID/组ID#include <unistd.h>uid_t getuid(void); //返回:调用进程的实际用户IDuid_t geteuid(void); //返回:调用进程的有效用户IDuid_t getresuid(void); //返回:调用进程的设置用户IDgid_t getgid(void); //返回:调用进程的实际...原创 2019-11-14 21:33:16 · 1935 阅读 · 0 评论 -
Linux(程序设计):22---Windows与Linux系统之间的MySQL连接
前言默认情况下,MySQL是不允许让自己所在局域网的其它网络所连接的,因此我们需要设置一些方法,让MySQL可以让其他网络访问 本文介绍在Windows下连接Ubuntu的MySQL,另外Ubuntu去连接Windows的数据库也是原理相同的第一步:默认情况下,我们在Linux下开启MySQL,使用Windows的工具去连接,都会显示错误。例如下面用Windows下的Navicat去连...原创 2019-12-07 18:13:50 · 612 阅读 · 0 评论 -
Linux(程序设计):23---程序编译错误mysql.h: No such file or directory
一、错误在编译带有MySQL接口的C语言程序时,如果出现如下错误二、错误原因及解决办法错误原因①编译时,.c头文件已经添加了#include <mysql.h>,但是gcc没有提供-I和-L选项解决办法gcc添加-I和-L编译选项分别提供include路径和库文件路径gcc -I/usr/include/mysql demo.c -L/usr/lib/my...原创 2019-12-18 13:51:30 · 2290 阅读 · 0 评论 -
Linux(程序设计):25---gcc/g++编译器提供的原子操作(__sync_xxx)
本文所有代码对应的GIthub链接为: 一、先来看一个非原子操作演示案例在C/C++中,一个简单的自加操作需要涉及三个步骤: 第一步:将值从内存中取到寄存器中 第二步:在寄存器中将值增加 第三步:将增加后的值重新写入内存 从上面可以看出,一个自加操作都不是原子的,因此对于多线程来说,自加操作需要加锁才能保证安全演示案例下面演示一个全局变量在多个线程中进行自增操作,最终的结果会与预期的不一致//non-atomic_i++_thread.cpp#include &..原创 2020-06-06 20:30:53 · 1531 阅读 · 0 评论 -
Linux(程序设计):26---字符集与字符编码概述(附Unicode字符集实现原理)
一、字符集和字符编码的区别和联系两者的概念与区别: 字符集:多个字符的集合。例如 GB2312 是中国国家标准的简体中文字符集,GB2312 收录简化汉字(6763 个)及一般符号、序号、数字、拉丁字母、日文假名、希腊字母、俄文字母、汉语拼音符号、汉语注音字母,共 7445 个图形字符 字符编码:把字符集中的字符编码为(映射)指定集合中的某一对象(例如:比特模式、自然数序列、电脉冲),以便文本在计算机中存储和通过通信网络的传递 两者的关系: 字符集是书写系统字母与符号的集合 而字符编原创 2020-06-09 12:03:30 · 1050 阅读 · 0 评论 -
Linux(程序设计):27---iconv库(转换字符编码)
待续原创 2020-06-11 00:10:34 · 4786 阅读 · 1 评论 -
Linux(程序设计):28---数据流压缩原理(Deflate压缩算法、gzip、zlib)
一、压缩原理压缩原理其实很简单,就是找出那些重复出现的字符串,然后用更短的符号代替, 从而达到缩短字符串的目的。比如,有一篇文章大量使用"中华人民共和国"这个词语, 我们用"中国"代替,就缩短了 5 个字符,如果用"华"代替,就缩短了6个字符。事实上, 只要保证对应关系,可以用任意字符代替那些重复出现的字符串 本质上,所谓"压缩"就是找出文件内容的概率分布,将那些出现概率高的部分代替成更短的形式。所以: 内容越是重复的文件,就可以压缩地越小。比如,"ABABABABABABAB"可以压缩成"7AB"原创 2020-06-11 15:25:03 · 4357 阅读 · 1 评论 -
Linux(程序设计):29---Zlib库(数据压缩与解压)
一、Zlib库概述zlib压缩算法页是对deflate进行的封装,在另一篇文章中我们介绍过了Deflate压缩算法算法,文章最后也提到了zlib压缩算法。具体可以参阅:https://blog.youkuaiyun.com/qq_41453285/article/details/106685915Zlib库相关函数压缩函数: deflateInit : 参数比较少,里面的实现其实是调用的deflateInit2 deflateInit2: 压缩初始化的基础函数,有很多参数,下面会重点介绍 ...原创 2020-06-11 15:25:47 · 6212 阅读 · 1 评论 -
Linux(程序设计):30---cJSON库(C语言操作JSON)
一、cJSON库概述JSON语法介绍可以参阅:https://blog.youkuaiyun.com/qq_41453285/article/details/106699314 cJSON开发库是C语言提供的对JSON操作的APIcJSON库的编译安装下载:git clone https://github.com/DaveGamble/cJSON.git...原创 2020-06-12 22:00:32 · 3447 阅读 · 0 评论 -
Linux(程序设计):31---jsoncpp库(C++操作JSON)
一、jsoncpp库概述jsoncpp是一个c++封装的json包,跨平台支持windows、linux、unix等多系统 jsoncpp源码地址:https://github.com/open-source-parsers/jsoncpp库的安装sudo apt-get install libjsoncpp-dev安装完成之后,头文件默认安装在/usr/include/jsoncpp/json/目录下,库API文档默认在/usr/share/doc/libjsoncpp-dev/目原创 2020-06-12 23:01:09 · 2046 阅读 · 1 评论 -
Linux(程序设计):41---TCP网络编程
服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束服务端通信步...原创 2019-03-22 15:51:16 · 794 阅读 · 0 评论 -
Linux(程序设计):42---UDP网络编程(单播)
服务端通信步骤如下:socket(); //建立一个socket bind(); //将这个socket绑定在某个端口上 sendto(); //向客户端的某个端口发起请求 recvfrom(); //如果没有客户端发起请求,则会阻塞在这个函数里 close(); //通信完成后关闭socket客户端...原创 2019-03-23 22:29:50 · 891 阅读 · 0 评论 -
Linux(程序设计):43---UDP广播编程
一、广播的概念广播(broadcast)是指封包在计算机网络中传输时,目的地址为网络中所有设备的一种传输方式。实际上,这里所说的“所有设备”也是限定在一个范围之中,称为“广播域”二、组播的优点/特点广播只能在一个广播域(局域网)中传播,而不能跨网段传播。发出的数据包,局域网的所有主机都能收到这个数据包 广播通信由UDP实现 路由器不转发广播数据包。交换机会转发广播数据包...原创 2019-03-27 08:55:24 · 718 阅读 · 0 评论 -
Linux(程序设计):44---UDP组播编程
组播又名多播一、组播简介组播(multicast,台湾又译作多点发送、多点广播或群播,中国大陆又译作组播)是指把信息同时传递给一组目的地址。它使用策略是最高效的,因为消息在每条网络链路上只需传递一次,而且只有在链路分叉的时候,消息才会被复制。与多播相比,常规的点到单点的传递被称作单播。当以单播的形式把消息传递给多个接收方时,必须向每个接收者都发送一份数据副本。由此产生的多余副本将导致发送...原创 2019-03-27 17:14:08 · 786 阅读 · 0 评论 -
Linux(程序设计):24---无锁CAS(附无锁队列的实现)
本文所有代码对应的Github链接为:https://github.com/dongyusheng/csdn-code/tree/master/cas_queue一、引言锁是解决并发问题的万能钥匙,可是并发问题只有锁能解决吗?当然不是,CAS也可以解决并发问题二、什么是CAS比较并交换(compare and swap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作,从而避免多线程同时改写某⼀数据时由于执行顺序不确定性以及中断的不可预知性产⽣的数据不一致问题 有了C原创 2020-06-06 16:18:29 · 2024 阅读 · 0 评论 -
Linux(程序设计):45---高并发线程池的设计
一、设计线程池的优点、作用 线程使应用能够更加充分合理的协调利用cpu 、内存、网络、i/o等系统资源 线程的创建需要开辟虚拟机栈,本地方法栈、程序计数器等线程私有的内存空间 在线程的销毁时需要回收这些系统资源。频繁的创建和销毁线程会浪费大量的系统资源,增加并发编程的风险 另外,在服务器负载过大的时候,如何让新的线程等待或者友好的拒绝服务?这些丢失线程自身无法解...原创 2019-08-18 22:00:12 · 968 阅读 · 3 评论 -
Linux(程序设计):47---recv、send实现带外数据的读写(MSG_OOB选项)
一、带外数据有些传输层协议具有带外(Out Of Band,OOB)数据的概念,用于迅速通告对方本端发生的重要事件。因此,带外数据比普通数据(也称为带内数据)有更高的优先级,它应该总是立即被发送,而不论发送缓冲区中是否有排队等待发送的普通数据。带外数据的传输可以使用一条独立的传输层连接,也可以映射到传输普通数据的连接中 实际应用中,带外数据的使用很少见,已知的仅有telnet、ftp等远程非...原创 2019-11-09 12:47:25 · 1204 阅读 · 0 评论 -
Linux(程序设计):48---缓冲区大小(SO_RCVBUF、SO_SNDBUF套接字选项)
套接字选项详细介绍,见文章:https://blog.youkuaiyun.com/qq_41453285/article/details/89536443一、选项简单介绍当使用setsockopt来设置TCP的接收缓冲区和发送缓冲区的大小时,系统都会将其值加倍,并且不得小于某个最小值。TCP接收缓冲区的最小值是256字节(不同系统会有不同的值),而发送缓冲区的最小值是2048字节(不同系统会有不同的值...原创 2019-11-09 14:45:48 · 3906 阅读 · 0 评论 -
Linux(程序设计):49---dup实现一个基本的CGI服务器
dup函数介绍,见文章:https://blog.youkuaiyun.com/qq_41453285/article/details/102987052程序设计下面利用dup函数实现了基本的CGI服务器//dup.c#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#...原创 2019-11-09 14:50:31 · 607 阅读 · 0 评论 -
Linux(程序设计):50---readv、writev函数解析处理HTTP报文
readv、writev函数的用法见文章:https://blog.youkuaiyun.com/qq_41453285/article/details/89354096程序设计HTTP响应报文通常包含1个状态行、多个头部字段、1个空行和文档。其中,前3部分的内容可能被Web服务器放置在一个内存中,而文档的内容则通常被读入到另一块单独的内存中(通过read或者mmap函数),我们并不需要将这部分的内容拼...原创 2019-11-09 15:07:41 · 727 阅读 · 0 评论 -
Linux(程序设计):51---select实现接收普通数据与带外数据
select的基本用法见文章:https://blog.youkuaiyun.com/qq_41453285/article/details/89336199一、项目目的本篇文章介绍使用select来接收普通数据与带外数据,其中: 普通数据我们放在fd_set集合的可读集合中 带外数据放在fs_set集合的异常集合中 二、编码实现#include <stdio.h>#in...原创 2019-11-18 23:08:03 · 708 阅读 · 0 评论