C语言
益达张先生
这个作者很懒,什么都没留下…
展开
-
如何在man手册中查找C/C++结构体
【问题】如何在man手册中查找C/C++结构体参考:How to find man pages for C structs (struct sockaddr_in)?方法一最简单的方法,Google根据搜索到的结果可知,要查找的关键字在7手册页的ip项中方法二快速搜索man -k keyword暴力搜索,查找所有man手册man -K keyword...原创 2019-11-25 10:20:45 · 1763 阅读 · 0 评论 -
客户端服务器断开连接后,新连接在描述符号不变情况下,是否可以继续通信
客户端服务器断开连接后,新连接在描述符号不变情况下,是否可以继续通信?当然可以,描述符指定了一个socket通信,描述符号相同,无论socket使用方式是否变化或者重新连接,使用原来描述符的部分不受影响。测试程序:客户端:#include <sys/types.h>#include <errno.h>#include <sys/socket.h&...原创 2019-11-21 17:18:22 · 346 阅读 · 0 评论 -
Linux 指定编译时动态库路径和运行时动态库路径--解决报错symbol lookup error和cannot open shared object file
动态库的两种路径linux指定动态库路径包括:1.指定编译时动态库路径;2.指定运行时动态库路径。后文提到的动态库路径都是指的是这两种路径。众所周知,Linux动态库的默认搜索路径是/lib和/usr/lib(不管是编译还是运行都会默认搜索这两个路径)。动态库被创建后,一般都复制到这两个目录中。当程序执行时需要某动态库,并且该动态库还未加载到内存中,则系统会自动到这两个默认搜索路径中去查找相应...原创 2019-11-15 09:58:36 · 4788 阅读 · 0 评论 -
gcc -fpic 和 -fPIC 参数问题
gcc -fpic 和 -fPIC 参数问题目的:生成位置无关的代码。位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。如果不加-fPIC,则加载.so文件的代码段时,代码段引用的数据对象需要重定位,...原创 2019-11-14 17:16:13 · 3337 阅读 · 0 评论 -
GDB -fprofile-arcs -ftest-coverage 选项
-fprofile-arcs -ftest-coverage 选项的使用参考:https://gcc.gnu.org/onlinedocs/gcc-4.4.1/gcc/Debugging-Options.html-fprofile-arcsAdd code so that program flowarcsare instrumented. During execution t...原创 2019-11-14 14:09:35 · 450 阅读 · 0 评论 -
Linux 程序性能分析与优化
参考:https://linuxtools-rst.readthedocs.io/zh_CN/latest/advance/03_optimization.html目录1. 分析系统瓶颈2. 分析内存瓶颈3. 分析IO瓶颈4. 分析进程调用5. 优化程序代码 gprof使用步骤6. 其它工具1. 分析系统瓶颈系统响应变慢,首先得定位大致的问题出在哪里,...原创 2019-10-17 10:41:52 · 1614 阅读 · 0 评论 -
Linux C编程 —— 通过文件描述符获得文件路径
文件描述符可以通过open等函数获得;文件流可以通过fopen获取,然后通过fileno获取文件流对应的文件描述符。#include "apue.h"intmain(void){ char name[L_tmpnam], line[MAXLINE]; FILE *fp; struct stat statbuf; char buf[10...原创 2019-06-01 16:28:02 · 1238 阅读 · 0 评论 -
Linux C编程——结构体操作注意事项(深拷贝、偏移量)
在结构体中,需要考虑的有:内存对齐,下面例子可以看到; 结构体含一级、二级指针,有深拷贝和浅拷贝之分; s.i和s->i是计算偏移量,在CPU中计算,不会操作内存。有一个宏 offoset 可以计算结构体成员偏移:SYNOPSIS #include <stddef.h> size_t offsetof(type, member);...原创 2019-05-31 16:48:05 · 573 阅读 · 2 评论 -
Linux 编程——获取时间戳,精确到毫秒
获取时间戳,精确到毫秒/* 日志时间戳,精确到毫秒 */char* get_stime(void){ static char timestr[200] ={0}; struct tm * pTempTm; struct timeval time; gettimeofday(&time,NULL); pTempTm = ...原创 2019-05-31 10:56:24 · 7573 阅读 · 0 评论 -
Linux C编程——strtok_r 和 strtok 函数
一、简介NAME strtok, strtok_r - extract tokens from stringsSYNOPSIS #include <string.h> char *strtok(char *str, const char *delim); char *strtok_r(char *s...原创 2019-05-31 09:40:33 · 689 阅读 · 0 评论 -
unix环境高级编程第三版(apue)源代码编译及使用
(1)下载源代码,可以去官网下载:http://apuebook.com/code3e.htm(2)解压缩源代码文件:tar -zxvf src.3e.tar.gz(3)安装libbsd-devel,否则编译会报错不通过,会提示编译threads文件夹里面的内容时报错:/tmp/ccvzZHtf.o: In function `thr_fn':barrier.c:(.text+0x...原创 2019-05-17 23:25:28 · 510 阅读 · 0 评论 -
Linux C 编程——使用json-c库读取json格式的配置文件
1. 简介:参考:https://github.com/json-c/json-c/wikihttps://github.com/json-c/json-chttps://blog.csdn.net/u014530704/article/details/72674642?utm_source=copyhttps://blog.csdn.net/w_ww_w/article...原创 2019-05-17 15:14:00 · 7484 阅读 · 0 评论 -
Linux——内存文件系统
Linux内存文件系统:可满足高IO的要求ramdisk: 基于虚拟在内存中的其他文件系统(ex2fs)。 挂载方式:mount /dev/ram /mnt/ramdisk ramfs: 物理内存文件系统,只存在于物理内存中。其大小也不是固定的,而是随着所需要的空间动态得增减。 挂载方式:mount -t ramfs none /mnt/ramfs -o maxsize=2000 ...原创 2019-06-03 14:55:50 · 9099 阅读 · 0 评论 -
linux C —— 通用链表(整理自Linux内核链表)
目录1. 简介1.1 内核链表的思想1.2 内核链表的技术原理:2. 基于内核链表的通用链表2.1 list.h2.2 test.c3. 内核链表4. 文件下载1. 简介在Linux源代码树的include/linux/list.h文件中,采用了一种类型无关的双循环链表实现方式。其思想是将指针prev和next从具体的数据结构中提取出来构成一种通用的"...原创 2019-06-18 00:44:35 · 2310 阅读 · 1 评论 -
Linux C —— 三种链接属性(external、internal、none)
一、问题引出当多个源文件链接在一起,我们如何处理相同名字的标识符?假设多个源文件均含有变量a,那么它的值到底采用哪个源文件定义的值呢?这就涉及到标识符的链接属性。二、对象链接属性针对标识符而言,对象通常是变量、函数名、形参。三、分类链接属性(linkage)分为三种——外部(external)、内部(internal)、无(none)3.1 外部(external)判...原创 2019-07-05 16:52:25 · 2204 阅读 · 0 评论 -
Linux实用工具—— gprof 统计代码行执行次数、时间
gprof1.1简介gprof实际上只是一个用于读取profile结果文件的工具。gprof采用混合方法来收集程序的统计信息,他使用检测方法,在编译过程中在函数入口处插入计数器用于收集每个函数的被调用情况和被调用次数;也使用采样方法,在运行时按一定间隔去检查程序计数器并在分析时找出程序计数器对应的函数来统计函数占用的时间。Gprof具有以下优缺点:1)优点:...转载 2019-08-02 15:36:23 · 1368 阅读 · 0 评论 -
Linux C —— c程序中获取shell脚本输出(如获取system命令输出)
目录1.使用临时文件1.1 使用shell的重定向1.2 freopen标准输出到文件2. 使用匿名管道3. 使用popen4. 小结1.使用临时文件1.1 使用shell的重定向首先想到的方法就是将命令输出重定向到一个临时文件,在我们的应用程序中读取这个临时文件,获得外部命令执行结果,代码如下所示: #define CMD_STR_LEN 10...原创 2019-08-08 15:17:11 · 2639 阅读 · 1 评论 -
fork —— Linux系统编程
循环创建子进程,并区分各个子进程和父进程。#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <string.h>int counter = 1...原创 2018-08-02 23:07:05 · 122 阅读 · 0 评论 -
Linux C 开发 配置文件读写库 Libconfig
一:什么是Libconfig?程序开发过程中往往很多参数需要放在配置文件中,因为这样可以避免更改代码重新编译的问题。通常我们可以通过自己读init文件来实现,不过已经有很多人做了这方面的东西,可以借用,Libconfig就是其中之一。Libconfig是一个用于处理结构化配置文件的简单库。 此文件格式比XML更紧凑,更易读,更适合内存受限的设备。 与XML不同,它是类型感知的,因此不必在应...原创 2019-05-17 10:26:04 · 3919 阅读 · 0 评论 -
Linux C 编程 —— fcntl、ioctl和stat区别
1、 fcntl#include <unistd.h>#include <fcntl.h>int fcntl(int fd, int cmd, ... /* arg */ );fcntl函数可以改变某进程中一个已打开的文件的属性,可以重新设置读、写、追加、非阻塞等标志(这些标志称为File Status Flag),而不必重新open文件。通过fcntl...原创 2019-05-22 09:21:17 · 593 阅读 · 0 评论 -
Linux C 开发 —— #if、#ifdef、#if defined之间的区别
https://www.cnblogs.com/wuchanming/p/4057630.html#if的使用说明#if的后面接的是表达式#if (MAX==10)||(MAX==20) code... #endif它的作用是:如果(MAX==10)||(MAX==20)成立,那么编译器就会把其中的#if 与 #endif之间的代码编译进去(注意:是编译进去,不是执行!!)#...原创 2019-05-10 15:58:17 · 3011 阅读 · 0 评论 -
信号 —— Linux 编程
一、简介A 给 B 发送信号,B 收到信号之前执行自己的代码,收到信号后,不管执行到程序的什么位置都要暂停运行,去处理信号,处理完毕再继续执行,与硬件中断类似 —— 异步模式 ,但信号是软件层面上实现的中断,早期被称为“软中断”。每个进程收到的所有信号,都是由内核负责发送的,内核处理。1、信号的产生(1)、按键产生,如: Ctrl+c :2) SIGINT (终止/中断) ...原创 2018-09-14 13:36:04 · 165 阅读 · 0 评论 -
利用samba实现source Insight编辑Linux下代码——Linux编程工具
参考连接:http://wiki.ubuntu.com.cn/Samba下面是在Kubuntu 10.10下安装samba的步骤:1. 首先安装samba软件:sudo apt-get install sambasudo apt-get install smbfssudo apt-get install samba42. 修改代码目录权限接着把用户目录权限设置为任何人都...原创 2018-08-27 23:18:17 · 2213 阅读 · 0 评论 -
Linux守护进程 —— Linux系统编程
一、什么是守护进程1、守护进程守护进程也称精灵进程(Daemon),是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。同时,守护进程完成许多系统任务。比如,作业规划进程crond等。3、守护进程的特点 没...原创 2018-08-23 15:04:22 · 495 阅读 · 1 评论 -
进程的状态 —— Linux系统编程
进程状态(R、S、D、T、Z、X)一、进程概念: 1)正在执行的程序 2)正在计算机上执行的程序实例 3)能分配处理器并由处理器执行的实体 进程的两个基本元素是程序代码和代码相关联的数据集。进程是一种动态描述,但并不代表所有的进程都在运行。这就可以引入‘进程状态’。 进程在内存中因策会略或调度需求,会处于各种状态。二、Linux下的进程状态:static const c...原创 2018-08-15 15:28:54 · 195 阅读 · 0 评论 -
系统IO和标准C库IO函数 ——Linux编程
一、C库IO函数工作流程示意图: FILE 类型的指针,是特殊结构体类型,包含文件描述符、读写指针位置、内存地址等信息,用于文件读写操作。I/O缓冲区用于利用内存减少硬盘操作。在右侧三种情况下刷新缓冲区,存到硬盘上。磁盘为什么这么慢? 大部分硬盘是机械硬盘,读取寻道时间和写入寻道时间都是在毫秒级(ms)、相对于内存来说读写速...原创 2018-07-31 00:04:21 · 899 阅读 · 0 评论 -
动态库(共享库)、静态库的制作——Linux编程
动态库(共享库)、静态库的制作零、动态库(共享库)、静态库的联系与区别这两种库相同点是两种库都是由.o文件生成的,下边讨论一下它们的不同点: 静态库 静态库文件名的命名方式是“libxxx.a”,库名前加”lib”,后缀用”.a”,“xxx”为静态库名。 链接时间: 静态库的代码是在编译过程中被载入程序中。 链接方式:静态库的链接是将整个函数库的所有数据都整合进了目标代码...原创 2018-07-29 15:06:14 · 145 阅读 · 0 评论 -
extern使用方法总结 ——Linux编程
简介某一变量在整个程序中只可以定义一次,但可以声明多次,否则会产生重定义的错误。extern是计算机语言中的一个关键字,可置于变量或者函数前,以表示变量或者函数的定义在别的文件中。提示编译器遇到此变量或函数时,在其它模块中寻找其定义,另外,extern也可用来进行链接指定。用于变量 只能用于同类型声明 在一个源文件里定义了一个数组:char a[6];在另外一个文件里用...转载 2018-07-25 23:04:40 · 2332 阅读 · 0 评论 -
shell命令行选项与参数处理--getopt--getopts ——Linux编程
目录 简介1. 手工处理选项和参数2. 使用 getopts 处理多命令行选项3. 使用 getopt 处理多命令行选项简介本文介绍了linux shell中使用命令行选项与命令行参数的方法,在bash中,可以用以下三种方式来处理命令行参数,每种方式都有自己的应用场景。1,直接处理,依次对$1,$2,...,$n进行解析,分别手工处理;2,getopts来...原创 2018-07-24 23:54:37 · 2741 阅读 · 0 评论 -
Assert断言函数使用 —— Linux 编程
1. 简介头文件<assert.h>其作用: 如果它的条件返回错误,则终止程序执行。原型定义:#include <assert.h>void assert( int expression );assert的作用是先计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运...原创 2018-10-12 08:49:32 · 253 阅读 · 0 评论 -
可重入函数与不可重入函数 —— Linux编程
1、定义一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。可重入函数(用于信号处理函数、 且 安全时的叫法),即是在信号处理函数中可以调用的函数,...原创 2018-10-10 21:41:25 · 302 阅读 · 0 评论 -
C语言结构体成员偏移量的计算
请参考https://blog.csdn.net/coding__madman/article/details/51556411计算方式:1. 使用宏函数:#include <stddef.h> size_t offsetof(type, member);2. 自己计算偏移(B-A形式)测试代码如下:#include <stdi...原创 2019-04-11 15:29:52 · 1837 阅读 · 0 评论 -
Linux 系统编程 —— GCC常用命令
目录1简介2简单编译2.1预处理2.2编译为汇编代码(Compilation)2.3汇编(Assembly)2.4连接(Linking)3多个程序文件的编译4检错5库文件连接5.1编译成可执行文件5.2链接5.3强制链接时使用静态链接库1简介GCC 的意思也只是 GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅...转载 2019-03-11 10:52:49 · 201 阅读 · 0 评论 -
Linux 系统编程 —— C结构体之位域(位段)
有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一...原创 2019-03-07 12:41:29 · 2330 阅读 · 2 评论 -
C语言可变参数函数 —— Linux 编程
一、可变参数介绍C 语言允许定义参数数量可变的函数,这称为可变参数函数(variadic function)。这种函数需要固定数量的强制参数(mandatory argument),后面是数量可变的可选参数(optional argument)。这种函数必须至少有一个强制参数。可选参数的类型可以变化。可选参数的数量由强制参数的值决定,或由用来定义可选参数列表的特殊值决定。C 语言中最常用的...原创 2019-01-16 14:38:10 · 1078 阅读 · 1 评论 -
根据配置文件初始分结构体 —— Linux 编程
static int read_conf_init_info(char * file_path, myStruct *attr){ int value = 0; char buf[256] = {0}; char *buf_ptr = NULL; char *value_ptr = NULL; char *cur_ptr = NULL; FILE *fp = NULL; ...原创 2018-12-17 15:02:50 · 287 阅读 · 0 评论 -
linux inotify 监控文件系统事件
1. Inotify 机制概述1.1. Inotify 介绍在日常的运维过程中,经常需要备份某些文件,或者对系统的某些文件进行监控,比如重要的配置文件等。如果需要作到实时同步或者监控,就需要使用内核的inotify机制Inotify 是基于inode级别的文件系统监控技术,是一种强大的、细粒度的、异步的机制,它满足各种各样的文件监控需要,不仅限于安全和性能Inotify 不需要对被监...原创 2018-12-03 11:16:43 · 3888 阅读 · 0 评论 -
段错误排查 —— 利用dmesg
一、 问题现象用户环境发生段错误,提供信息如下:Dmesg:myTest[12427]: segfault at 845bf7c ip 6f57c612 sp 77c9f3d8 error 4in libsqlite3.so.0.8.6[6f535000+63000]myTest[12743]: segfault at 9788f7c ip 6f550612 sp 77d9cc88...原创 2018-11-21 11:09:13 · 3807 阅读 · 0 评论 -
Linux error函数 ——Linux编程
简介error系列函数是Linux系统编程中,一种debug的方式,定义在头文件 <errno.h>中。源代码使用说明三个函数如下:1. void error (int status, int errnum, const char *format,...);这个函数的作用是在输出设备上打印出 errnum 对应的出错信息和format 对应的子串。__st...转载 2018-07-23 23:18:26 · 5297 阅读 · 0 评论