C/C++
文章平均质量分 66
HideInTime
这个作者很懒,什么都没留下…
展开
-
GCC动态链接库规范和问题
对于动态链接库,实际的符号定位是在运行期进行的,在编译.so的时候,如果没有把它需要的库和他一起进行联编,比如libx.so 需要使用uldict, 但是忘记在编译libx.so的时候加上-luldict的话,在编译libx.so的时候不会报错,因为这个时候libx.so被认为是一个库,它里面存在一些不知道具体实现的符号是合法的,是可以在运行期指定或者编译另外的二进制程序的时候指定。(2) 连接库参数的顺序不对。(4) /lib 和 /usr/lib (64位下是/lib64和/usr/lib64)转载 2023-02-14 15:04:09 · 567 阅读 · 0 评论 -
深入解析linux动态链接
动态连接是现在操作系统中程序的默认使用方式,非常重要。但是搞懂动态连接你必须真正掌握静态连接。不然你是看不明白的。转载 2022-12-01 15:06:24 · 681 阅读 · 0 评论 -
基础进程通信方式
1.无名管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。int fd[2];//0读出,1写入pipe(fd);int pid = fork();if(pid==0){ close(fd[1]); read(fd[0], buf, len);}else if(pid>0){ close(fd[0]); write(fd[1], buf, len);}2.高级原创 2022-05-13 10:23:32 · 176 阅读 · 0 评论 -
代码规范个人版
代码规范分:1、可读性编写规范2、安全性执行规范个人规范标准:一、命名规范匈牙利命名法:广泛应用于Microsoft Windows这类环境中。驼峰命名法(Camel/小驼峰):第一个单词首字母小写,余下的单词首字母大写。帕斯卡命名法(Pascal/大驼峰):所有单词首字母大写。下划线命名法:下划线法是随着C语言的出现流行起来的,在UNIX/LIUNX这样的环境,以及GNU代码中使用非常普遍。1、...原创 2022-02-25 15:04:18 · 426 阅读 · 0 评论 -
linux的so动态库可执行(节.interp)
代码如下mytest.c#include<stdio.h>#include<stdlib.h>//在elf格式中加入一个节.interp 此节含有 ELF 程序解析器的路径名//如果动态库不包括此节就不能被执行//注意你的连接器地址不一定是/lib64/ld-linux-x86-64.so.2这个路径哈 自己查找下你环境中的连接器地址const char ldpath[] __attribute__ ((section (".interp"))) = "/li...原创 2021-08-17 11:13:16 · 909 阅读 · 0 评论 -
c语言规范历史
1972年C语言诞生,C语言之父是丹尼斯·里奇(Dennis Ritchie),同时也是UNIX之父。C语言标准发布顺序:K&R C:1978年由布莱恩·柯林汉(Brian Kernighan)和丹尼斯·里奇(Dennis Ritchie)出版了《The C Programming Language》,这本书被C语言开发者们称为K&R,很多年来被当作C语言的非正式标准。人们称这个版本的C语言为K&R C。 ANSI C:1989年ANSI发布了C语言标准,被称为C89、AN原创 2021-04-15 00:25:20 · 251 阅读 · 0 评论 -
重定向动态库中的输出
问题已解决,解决方案如下:1.一个全局的文件描述符用来记录原来的标准输出文件描述符2.封装俩个函数,功能分别是打开和关闭标准输出文件描述符的函数3.封装一个输出函数,函数内部调用第二步封装的打开函数,然后输出,接着调用关闭函数4.main函数逻辑。首先调用第二步封装的关闭函数,接着如需输出信息则调用第三步封装的输出函数,代码如下:#include<stdio.h>#include <stdlib.h>#include<unistd.h>#include原创 2021-04-06 16:57:11 · 454 阅读 · 0 评论 -
Mystery.c
#include <stdio.h>main(t,_,a )char* a;{return!0<t?t<3?main(-79,-13,a+main(-87,1-_,main(-86,0,a+1 )+a)):1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13?main(2,_+1,"%s %d %d\n"):9:16:t<0?t<-72?main(_,t,"@n'+,#'/*{}w+.原创 2021-03-31 21:41:20 · 247 阅读 · 0 评论 -
Linux的共享内存
一、shm方式和mmap方式区分 二者本质上是类似的,mmap可以看到文件的实体,而 shmget 对应的文件在交换分区上的 shm 文件系统内,无法直接 cat 查看 安全性:mmap 方式对应的真实文件,如果用户有权限即可查看,甚至删除 shmget 方式其实也一样,好了一层皮罢了(ipcrm -m …) 一致性:mmap 方式下各进程映射文件的相同部分可以共享内存 shmget 时各个进程共享同一片内存区...原创 2021-02-19 11:55:11 · 766 阅读 · 0 评论 -
setsockopt常用设置
1. 如果在已经处于 ESTABLISHED状态下的socket(一般由端口号和标志符区分)调用closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:BOOL bReuseaddr=TRUE;setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL));2. 如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历TIME_WAI原创 2021-01-28 11:40:36 · 461 阅读 · 1 评论 -
压缩算法和压缩库
LZ4LZ4能很好的支持多线程环境,获得更高的压缩和解压速度。QuickLZQuickLZ官网:http://www.quicklz.com/QuickLZ is the world's fastest compression library, reaching 308MB/s per core.QuickLZ自称是世界上最快的压缩算法,然而我们看到它和LZ4还是有差距的,特别是解压速度。snappysnappy项目:https://code.google.c..原创 2020-12-15 14:55:07 · 1355 阅读 · 0 评论 -
fork在多线程下的使用
谨慎使用多线程中的fork2015-02-07 19:23origins 阅读(16611) 评论(4)编辑收藏前言在单核时代,大家所编写的程序都是单进程/单线程程序。随着计算机硬件技术的发展,进入了多核时代后,为了降低响应时间,重复充分利用多核cpu的资源,使用多进程编程的手段逐渐被人们接受和掌握。然而因为创建一个进程代价比较大,多线程编程的手段也就逐渐被人们认可和喜爱了。记得在我刚刚学习线程进程的时候就想,为什么很少见人把多进程和多线程结合起来使用呢,把二者结合起来不是更...转载 2020-11-30 15:59:24 · 943 阅读 · 0 评论 -
fuzzing工具之AFL的安装与使用
fuzzing工具之AFL的安装与使用AFL介绍:AFL即American Fuzzy Lop是当今使用最广泛的fuzzer,这个工具在程序执行前对程序源码进行插桩(instrumentation),以便在程序执行过程中实时获取程序的执行情况。AFL用遗传算法对程序的输入进行变异,用边覆盖(edge converage)来测试fuzzing的性能。在执行过程中,AFL向被测程序中输入input,然后获取程序的覆盖率,将覆盖率大的input保留下来进行变异,然后在下一轮测试中向被测程序中输出这些变转载 2020-09-03 15:44:50 · 592 阅读 · 0 评论 -
linux下把进程/线程绑定到特定cpu核上运行
概述现在大家使用的基本上都是多核cpu,一般是4核的。平时应用程序在运行时都是由操作系统管理的。操作系统对应用进程进行调度,使其在不同的核上轮番运行。对于普通的应用,操作系统的默认调度机制是没有问题的。但是,当某个进程需要较高的运行效率时,就有必要考虑将其绑定到单独的核上运行,以减小由于在不同的核上调度造成的开销。把某个进程/线程绑定到特定的cpu核上后,该进程就会一直在此核上运行,不会再被操作系统调度到其他核上。但绑定的这个核上还是可能会被调度运行其他应用程序的。操作系统对多核cpu的调度转载 2020-09-02 11:03:24 · 291 阅读 · 0 评论 -
GCC和C99标准中inline
GCC和C99标准中inline使用上的不同之处本文介绍了GCC和C99标准中inline使用上的不同之处。inline属性在使用的时候,要注意以下两点:inline关键字在GCC参考文档中仅有对其使用在函数定义(Definition)上的描述,而没有提到其是否能用于函数声明(Declare)。从 inline的作用来看,其放置于函数声明中应当也是毫无作用的:inline只会影响函数在translation unit(可以简单理解为C源码文件)内的编译行为,只要超出了这个范围inline属性就没有任原创 2020-08-25 17:50:47 · 761 阅读 · 1 评论 -
linux项目文件编译
linux项目文件编译原创 2020-08-18 16:33:22 · 180 阅读 · 0 评论 -
vs的linux开发
https://www.cnblogs.com/apocelipes/p/10899484.html通常,当我们开发Linux程序时有两种方案:在Linux上直接编写程序并进行运行测试和调试 在Windows或Mac OS X上借助工具进行远程开发虽然我自己是在Linux环境上直接进行开发的,但也有许多的人是在Windows环境上从事开发工作的,如果离开自己熟悉的系统到陌生的环境上也许会影响到工作效率。因此今天我们就来看下如何在Windows上使用Visual Studio 2019进行Li转载 2020-07-28 19:01:45 · 1279 阅读 · 1 评论 -
CLR/CIL/CTS/CLI/BCL/FCL
CLR:公共语言运行库(CommonLanguageRuntime)CIL:通用中间语言(CommonIntermediateLanguage,简称CIL)CTS:通用类型系统(CommonTypeSystem)CLI:公共语言基础架构(CommonLanguageInfrastructure)BCL:基础类库(BaseClassLibrary)FCL:框架类库(FrameworkClassLibrary)...原创 2020-06-29 23:24:41 · 486 阅读 · 0 评论 -
Linux中的各种锁及其基本原理
Linux中的各种锁及其基本原理1.概述通过本文将了解到如下内容:Linux系统的并行性特征 互斥和同步机制 Linux中常用锁的基本特性 互斥锁和条件变量2.Linux的并行性特征Linux作为典型的多用户、多任务、抢占式内核调度的操作系统,为了提高并行处理能力,无论在内核层面还是在用户层面都需要特殊的机制来确保任务的正确性和系统的稳定运行,就如同一个国家需要各种法律条款来约束每个公民的行为,才能有条不紊地运转。在内核层面涉及到各种软硬件中断、进线程睡眠、抢占式内核调度、多处理转载 2020-06-24 10:31:01 · 438 阅读 · 0 评论 -
DPDK
高性能网络技术#随着云计算产业的异军突起,网络技术的不断创新,越来越多的网络设备基础架构逐步向基于通用处理器平台的架构方向融合,从传统的物理网络到虚拟网络,从扁平化的网络结构到基于 SDN 分层的网络结构,无不体现出这种创新与融合。这在使得网络变得更加可控制和成本更低的同时,也能够支持大规模用户或应用程序的性能需求,以及海量数据的处理。究其原因,其实是高性能网络编程技术随着网络架构的演进不断突破的一种必然结果。C10K 到 C10M 问题的演进#如今,关注的更多是 C10M 问题(即单机 1转载 2020-06-04 19:18:38 · 7716 阅读 · 1 评论 -
windows和Linux内存的对齐方式
一.内存对齐的初步解说内存对齐能够用一句话来概括:“数据项仅仅能存储在地址是数据项大小的整数倍的内存位置上”比如int类型占用4个字节,地址仅仅能在0,4,8等位置上。例1:#include <stdio.h>struct xx{ char b; int a; int c; char d;};int main(){ struct xx bb; printf("...转载 2020-05-11 15:45:16 · 409 阅读 · 0 评论 -
gcc多版本安装
1、安装SCL源yum install centos-release-scl-rh2、安装GCC/GCC-C++yum install devtoolset-7-gcc devtoolset-7-gcc-c++yum install devtoolset-8-gcc devtoolset-8-gcc-c++yum install devtoolset-9-gcc devtool...原创 2020-05-07 11:44:54 · 3352 阅读 · 0 评论 -
flock、lockf和fnctl区别
首先flock和fcntl是系统调用,而lockf是库函数。lockf实际上是fcntl的封装,所以lockf和fcntl的底层实现是一样的,对文件加锁的效果也是一样的。后面分析不同点时大多数情况是将fcntl和lockf放在一起的。下面首先看每个函数的使用,从使用的方式和效果来看各个函数的区别。1. flock函数原型int flock(int fd, int operation)...转载 2020-05-06 10:54:10 · 883 阅读 · 1 评论 -
linux下c获取网卡信息
在Linux下开发网络程序时,经常会遇到需要取本地网络接口名、IP、广播地址、子网掩码或者MAC地址等信息的需求,最常见的办法是配合宏SIOCGIFHWADDR、SIOCGIFADDR、SIOCGIFBRDADDR与SIOCGIFNETMASK作为参数调用函数ioctl分别获得MAC地址、IP地址、广播地址与子网掩码来实现。一次性获取此类信息的C语言代码实现如下。 1 #inc...转载 2020-04-30 16:21:42 · 1194 阅读 · 0 评论 -
gdb调试备忘
gdb progfile指令r:运行bt:查看当前地址堆栈1. 普通断点根据代码行数设置断点是最常见的一种方式,在debug程序运行前就可以进行断点的配置。如:(gdb) b src/main.cpp:127当程序执行到main.cpp文件的第127行时就会出发断点。2. 条件断点顾名思义,这种断点是当满足一定条件时才会触发,比较适合进行异常排查。设置方式(...原创 2020-04-26 17:21:26 · 139 阅读 · 0 评论 -
数组指针/指针数组和一二级指针
首先确定优先级:()>[]>*,另外数组指针,类比整型指针,表示指向数组的指针;指针数组,类比整型数组,表示元素为指针的数组。数组指针int (*p)[n] 首先()优先级高,它是一个指针,指向一个整型数组。n为数组的长度,当p+1时需要跨越n个整型数据的长度,通常用来表示二维数组及二维数组的函数传参。一维数组赋值给数组指针时,需要取数组地址或对其进行强制转换,另外相当于二...转载 2020-04-17 15:12:08 · 339 阅读 · 0 评论 -
ioctl
一、 什么是ioctl ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。它的调用个数如下:int ioctl(int fd, ind cmd, …); 其中fd是用户程序打开设备时使用open函数返回的文件标示符,cmd是用户程序对设备的控制命令,至于后面的省略号,那是...原创 2020-04-14 14:10:36 · 224 阅读 · 0 评论 -
select/poll/epoll
(1)select==>时间复杂度O(n)它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。(2)poll==>时间复杂度O(n)poll本质上和select没有区别,它将用...原创 2020-04-14 11:39:07 · 158 阅读 · 0 评论 -
exec系列函数
linux系统编程之进程(五):exec系列函数(execl,execlp,execle,execv,execvp)使用本节目标:exec替换进程映像 exec关联函数组(execl、execlp、execle、execv、execvp)一,exec替换进程映像在进程的创建上Unix采用了一个独特的方法,它将进程创建与加载一个新进程映象分离。这样的好处是有更多的余地对两种...转载 2020-04-11 11:02:55 · 245 阅读 · 0 评论 -
fork()函数详解
fork()函数详解一、fork入门知识一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程...转载 2020-03-31 17:03:15 · 3816 阅读 · 2 评论 -
C语言实现Base64编码转码
C语言实现Base64编码转码关于Base64的介绍有两篇文章已经做得非常好了:一篇是维基百科Base64的词条,如果被Q可以看本文????摘录维基百科Base64;另一篇是阮一峰的Base64笔记.说一说C语言的实现吧,其实维基百科给出了C语言的实现了,但是它用以处理File,当然原理都是一样的,File的处理其实可以放在外面做好.另外,根据Base64介绍可以看出来它以6比特为一个单元...转载 2020-03-30 10:15:49 · 3415 阅读 · 0 评论 -
C++多线程同步之临界区(CriticalSection)
C++多线程同步之临界区(CriticalSection)一、Win32平台1、相关头文件和接口#include <windows.h>CRITICAL_SECTION cs;//定义临界区对象InitializeCriticalSection(&cs);//初始化临界区EnterCriticalSection(&cs);//进入临界区LeaveCrit...转载 2020-03-27 18:01:35 · 477 阅读 · 0 评论 -
定义与声明、头文件与extern总结
定义与声明、头文件与extern总结(转) 本文转自:http://lpy999.blog.163.com/blog/static/117372061201182051413310/http://blog.csdn.net/feitianxuxue/article/details/7204116感谢博主,如有侵犯请告知删除 用#include可以包含其...转载 2020-03-26 18:06:41 · 262 阅读 · 0 评论 -
C的堆栈比较
在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。但对于很多的初学着来说,堆栈是一个很模糊的概念。堆栈:一种数据结构、一个在程序运行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的和汇编语言中的堆栈一词混为一谈。我身边的一些编程的朋友以及在网上看帖遇到的朋友中有好多也说不清堆栈,所以我想有必要给大家分享一下我对堆栈的看法,有说的不对的地方请朋友们不吝赐教...原创 2020-03-14 11:04:40 · 183 阅读 · 0 评论 -
C语言用regcomp、regexec、regfree和regerror函数实现正则表达式校验
一、正则表达式 1、介绍 应该都听过正则吧?主要应用在字符串匹配,而且它是通用的,各种语言都支持。例如可以用它匹配IP地址、邮箱等。举个例子说明一下正则有啥用: 例如,我在的公司,页面用PHP,后台用C,当添加用户邮箱时,我们老大就要求:PHP和C都要对用户输入的用户邮箱进行校验,这时正则表达式就派上用场了。 2、grep命令 我会用gre...转载 2019-12-27 10:54:16 · 1351 阅读 · 0 评论 -
sendto和recvfrom
UDP(user datagram protocol)用户数据报协议,属于传输层。 UDP是面向非连接的协议,它不与对方建立连接,而是直接把数据报发给对方。UDP无需建立类如三次握手的连接,使得通信效率很高。因此UDP适用于一次传输数据量很少、对可靠性要求不高的或对实时性要求高的应用场景。 UDP通信的过程如图所示: 服务端: (1)使用函数socket(...原创 2019-12-09 12:00:14 · 645 阅读 · 0 评论 -
c/c++程序的库问题
VS编译的问题,运行时库静态编译和动态链接(考虑到运行平台可能报缺少vcruntime100.dll/140.dll等问题)运行编译工具集V14对应140.dll-vs2017和vs2015v12对应120.dll-vs2013v10对应100.dll-vs2010v90对应90.dll-vs2008MT/MTd:静态编译到程序中重量级无环境依赖release/debug...原创 2019-12-06 10:32:34 · 189 阅读 · 0 评论 -
c/c++的printf和宏定义
宏定义替换printf自定义输出到终端和日志文件#define PRT(...) printf(##__VA_ARGS__);sprintf(buf,##__VA_ARGS__);log(buf);一、#用来把参数转换成字符串例子一:#define P(A) printf("%s:%d\n",#A,A);int main(int argc, char **argv){...原创 2019-11-27 13:19:09 · 1344 阅读 · 2 评论 -
问题解决:无法解析的外部符号 _imp_XXXXXXXXX
问题解决--无法解析的外部符号 _imp_XXXXXXXXX错误示例:出现字符_imp,说明不是真正的静态库,而是某个动态库的导入库,导入函数和自己不同名,所以加了字符_imp。比如说_imp_GetUserNameA就是GetUserNameA函数。会报这种错误的原因:1、说明注册表函数没有相关的lib库,我们需要在MSDN下搜索函数。2、如果有引入三方库文件,可能存在...原创 2019-11-21 14:15:06 · 21155 阅读 · 3 评论 -
Linux的SWAP分区
碰到这个问题:gcc : internal compiler error: Killed (program cc1plus)内存不足导致,需要扩展内存到虚拟内存来解决,于是总结整理了一下LINUX的SWAP管理问题无论是windows系统还是linux系统,除了物理内存外,都还有一个虚拟内存。在linux上,虚拟内存被称为swap space。过去以来,虚拟内存的大小应该是物理内存的两倍,...原创 2019-11-04 11:00:05 · 542 阅读 · 0 评论