C/C++
文章平均质量分 69
墨痕诉清风
始于情,行于心。
展开
-
C/C++创建tty,创建终端
【代码】C/C++创建tty,创建终端。原创 2022-08-31 10:55:08 · 582 阅读 · 0 评论 -
彻底弄懂计算机中的大端小端
大端与小端这个问题在做和其他设备交换原始字节数据的时候是非常重要的概念,也是必须要掌握的内容,但是很多人就是仅仅是稍微有些了解,但每次真正去做东西的时候,还是要花半天去想,博主就是这样的人,出现这样问题的真正原因是还没有完全弄清楚大端小端。今天就让我们一起彻底的弄懂这两个东西吧!先讲讲关于这两个东西的传说吧(也是抄来的^_^)“大端”和“小端”可以追溯到1726年的Jonathan Swift的《格列佛游记》,其中一篇讲到有两个国家因为吃鸡蛋究竟是先打破较大的一端还是先打破较小的一端而争执不休,甚至爆发了战原创 2020-04-08 18:08:16 · 1696 阅读 · 1 评论 -
C/C++ realloc()函数解析
2)如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据块释放掉,返回新的内存块位置。realloc(void *__ptr, size_t __size):更改已经配置的内存空间,即更改由malloc()函数分配的内存空间的大小。真是有点惭愧,这些内容本应该很早就掌握的,以前只是糊里糊涂的用,不知道在内存中具体是怎么回事,现在才弄清楚。1)如果当前内存段后面有需要的内存空间,则直接扩展这段内存空间,realloc()将返回原指针。原创 2020-04-10 16:27:42 · 6348 阅读 · 4 评论 -
C/C++劫持技术(函数劫持、dll注入、动态库注入、HOOK)
(1) 定义一个函数指针指向目标函数,这里目标函数是system例如:detour在realse模式生效(因为VS在Debug模式下已经把程序中的函数劫持了)//定义一个函数指针指向目标函数(2) 定义与目标函数原型相同的函数替代目标函数//3.定义新的函数替代目标函数,需要与目标函数的原型相同int result = MessageBoxA(0,"是否允许该程序调用system命令","提示",1);{//调用旧的函数}else{原创 2022-03-15 11:33:33 · 2727 阅读 · 0 评论 -
WMI介绍和应用查询硬件信息(硬盘信息、主板信息、BIOS信息、显示器信息、网络适配器、CPU信息)
目录查询硬盘信息如何使用WMI查询系统盘所在硬盘的硬盘序列号?如何使用WMI查询系统盘所在的硬盘的接口类型?如何使用WMI查询系统盘所在的硬盘的名字?如何使用WMI查询系统盘所在的硬盘的大小?查询主板信息如何使用WMI查询主板的序列号?查询BIOS信息如何使用WMI查询BIOS的序列号?如何使用WMI查询BIOS的厂商?如何使用WMI查询BIOS的版本号?如何使用WMI查询内存信息?查询显示器信息如何使用WMI查询显示器的分辨率?如何使用W..原创 2021-08-06 16:18:58 · 2036 阅读 · 0 评论 -
linux c 获取进程 可执行文件路径
查看 指定进程10010的 可执行文件路径。原创 2021-04-22 10:08:24 · 1404 阅读 · 0 评论 -
C/C++ select fd_set解释
win下面FD_SET就是检查SOCKET在数组中是否存在,如果不存在,那么就插入到数组最后。而FD_CLR(fd, set)是把fd后面的东西往前拷贝,然后计数减1.FD_ZERO仅仅是把计数置为0(这个要注意!很明了,一个计数的fd_count,另一个就是SOCKET数组。其中,FD_SETSIZE是64.(具体可以去查看vs的代码)根据IO状态修改fd_set的内容,由此来通知执行了select()的进程哪一socket或文件可读。select()机制中提供一fd_set的。原创 2020-04-30 15:03:30 · 1834 阅读 · 0 评论 -
C/C++端口复用SO_REUSEADDR(setsockopt参数)
端口复用允许在一个应用程序可以把 n 个套接字绑在一个端口上而不出错。端口复用允许在一个应用程序可以把 n 个套接字绑在一个端口上而不出错。但每个实例绑定的IP地址是不能相同的。1、当有一个有相同本地地址和端口的socket1处于TIME_WAIT状态时,而你启动的程序的socket2要占用该地址和端口,你的程序就要用到该选项。3、SO_REUSEADDR允许单个进程绑定相同的端口到多个socket上,但每个socket绑定的ip地址不同。4、SO_REUSEADDR允许完全相同的地址和端口的重复绑定。原创 2020-04-30 14:07:29 · 6590 阅读 · 1 评论 -
C/C++socket send函数MSG_NOSIGNAL
【代码】C/C++socket send函数MSG_NOSIGNAL。原创 2020-04-30 14:33:10 · 3331 阅读 · 0 评论 -
C/C++#if #ifdef #ifndef的区别
用条件编译,则不必一一删改printf语句,只需删除前面的一条“#define DEBUG”命令即可,这时所有的用DEBUG作标识符的条件编译段都使其中的printf语句不起作用,即起统一控制的作用,如同一个“开关”一样。的确,此问题完全可以不用条件编译处理,但那样做目标程序长(因为所有语句都编译),而采用条件编译,可以减少被编译的语句,从而减少目标的长度。现在先定义LETTER为1,这样在预处理条件编译命令时,由于LETTER为真(非零),则对第一个if语句进行编译,运行时使小写字母变大写。原创 2020-04-26 22:44:46 · 882 阅读 · 1 评论 -
C/C++获取指定网口的IP地址
【代码】C/C++获取指定网口的IP地址。原创 2020-04-23 14:57:06 · 2321 阅读 · 0 评论 -
C/C++struct tcphdr(TCP包头结构体)
struct tcphdr { __be16 source; __be16 dest; __be32 seq; __be32 ack_seq;#if defined(__LITTLE_ENDIAN_BITFIELD) __u16 res1:4, doff:4, fin:1, sy...原创 2020-04-19 20:07:52 · 4364 阅读 · 0 评论 -
C/C++struct iphdr(IP包头结构体)
为了计算一份数据报的IP校验和,首先把校验和字段置为0。首部长度(4位),首部长度是指IP层头部占32bit字的数目,也就是IP层头部包含多少个4字节(32b),包括任何选项,由于它是一个4bit(最大表示15)字段,因此首部最长位60个字节.普通IP数据报字段的值为5 ==》5*32/8=20Bytes。l 比特2是“部分片”(DF—Don’t Fragment)标志,如果将这一比特置1,IP将不对数据报进行分片,这是如果需要进行分片的数据报到来,会丢弃此数据报并发送一个ICMP差错报文给起始端。原创 2020-04-19 20:04:21 · 5604 阅读 · 1 评论 -
C/C++的readdir和readdir_r函数(遍历目录)
每次使用readdir后,readdir会读到下一个文件,readdir是依次读出目录中的所有文件,每次只能读一个这个特性和readdir_r()一样。原创 2020-04-18 19:30:57 · 10179 阅读 · 1 评论 -
C/C++htonl(), ntohl(), ntohs(),htons()
如 Intelx86结构下,short型数0x1234表示为34 12, int型数0x12345678表示为78 56 34 12如IBM power PC结构下,short型数0x1234表示为12 34, int型数0x12345678表示为12 34 56 78。在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题。在Linux和Windows网络编程时需要用到htons和htonl函数,用来将主机字节顺序转换为网络字节顺序。得到的结果是4096,初一看感觉很怪。原创 2020-04-17 21:20:33 · 3817 阅读 · 0 评论 -
C/C++获取当前路径、获取任意pid完整路径(readlink函数)
【代码】C/C++获取当前路径、获取任意pid完整路径(readlink函数)原创 2020-04-17 21:15:36 · 2762 阅读 · 0 评论 -
ip地址互转十进制数字(函数)
切记:得到的十进制数与 inet_addr(127.0.0.1) 函数得到的数据不一样,原因 inet_addr 函数得到的16进制做了大小端导致。原创 2020-03-09 14:21:40 · 11015 阅读 · 0 评论 -
C/C++unlink函数的使用
unlink()函数功能即为删除文件。执行unlink()函数会删除所给参数指定的文件。注意:执行unlink()函数并不一定会真正的删除文件,它先会检查文件系统中此文件的连接数是否为1,如果不是1说明此文件还有其他链接对象,因此只对此文件的连接数进行减1操作。若连接数为1,并且在此时没有任何进程打开该文件,此内容才会真正地被删除掉。在有进程打开此文件的情况下,则暂时不会删除,直到所有打开该文件的进程都结束时文件就会被删除。返回值:成功返回0,失败返回 -1。原创 2020-04-16 11:52:59 · 5377 阅读 · 0 评论 -
C/C++ 去掉字符串首位的空格字符
#include <unistd.h>char *util_trim(char *str){ char *end; while(isspace(*str)) str++; if(*str == 0) return str; end = str + strlen(str) - 1; while(end ...原创 2020-04-14 13:15:43 · 1268 阅读 · 0 评论 -
C/C++fflush(stdout)循环打印输出避免缓存区错误
在使用多个输出函数连续进行多次输出时,有可能发现输出错误。因为下一个数据再上一个数据还没输出完毕,还在输出缓冲区中时,下一个printf就把另一个数据加入输出缓冲区,结果冲掉了原来的数据,出现输出错误。 在 printf();后加上fflush(stdout); 强制马上输出,避免错误。实例//线程函数(1秒输出现记录的信息)static void *stats_thread(void...原创 2020-04-13 19:07:20 · 991 阅读 · 0 评论 -
C/C++vsnprintf用法(要配合va_list使用)
返回值:执行成功,返回最终生成字符串的长度,若生成字符串的长度大于size,则将字符串的前size个字符复制到str,同时将原串的长度返回(不包含终止符);const char *format [in], 指定输出格式的字符串,它决定了你需要提供的可变参数的类型、个数和顺序。用法类似于vsprintf,不过加了size的限制,防止了内存溢出(size为str所指的存储空间的大小)。va_list ap [in], va_list变量. va:variable-argument:可变参数。原创 2020-04-13 18:59:58 · 1694 阅读 · 1 评论 -
C/C++ 线程三种并发方式比较(传统互斥量加锁方式, no lock不加锁的方式, 原子函数方式)
如果在单核系统中,由于在上述三条指令的任何一条执行完后都可能发生任务切换,比如执行完第1条指令后就发生了任务切换,这时如果有其他任务来对a进行操作的话,当任务切换回来后,将继续对a进行操作,很可能出现不可预测的结果,因此上述三条指令必须使用锁来保护,以使这段时间内其他任务无法对a进行操作。使用lock前缀的指令实际上在系统中是使用了内存栅障(memory barrier),当原子操作在进行时,其他任务都不能对内存操作,会影响其他任务的执行。由于时序的因素,多个线程操作同一个全局变量,会出现问题。原创 2020-04-13 18:45:22 · 2325 阅读 · 0 评论 -
C/C++中volatile关键字的作用
C语言书籍这样定义volatile关键字:volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,告诉编译器对该变量不做优化,都会直接从变量内存地址中读取数据,从而可以提供对特殊地址的稳定访问。(简洁的说就是:volatile关键词影响编译器编译的结果,用volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错)可以的,例如只读的状态寄存器。由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。原创 2020-04-13 15:51:47 · 3350 阅读 · 0 评论 -
CLion远程调试
mingw远程环境:https://www.cnblogs.com/qiumingcheng/p/11185073.html(参考)mingw基础环境:https://www.cnblogs.com/future-dream/p/9510015.html(参考)环境准备假设本地开发环境是 Windows 操作系统,程序远程执行环境是 CentOS 操作系统。为满足远程调试,需要在...原创 2020-04-12 16:52:30 · 7845 阅读 · 0 评论 -
linux系统调用sysconf(获取系统信息)
当前计算机都是多核的,linux2.6提供了进程绑定cpu功能,将进程指定到某个core上执行,方便管理进程。linux提供了sysconf系统调用可以获取系统的cpu个数和可用的cpu个数。man一下sysconf,解释这个函数用来获取系统执行的配置信息。例如页大小、最大页数、cpu个数、打开句柄的最大个数等等。当前在线(可用)的处理器数量为 :1。可用页面的数量: 17336。最大打开的文件数: 1024。登录名的最大长度: 256。配置的处理器数量为 :1。主机名的最大长度: 64。原创 2020-04-10 21:22:19 · 1422 阅读 · 0 评论 -
C/C++glob函数遍历文件夹所有文件
#include <glob.h>#include <stdio.h>int main(){ glob_t pglob; int i; if (glob("abc/testdir.*", GLOB_ERR, NULL, &pglob) != 0) { printf("Failed to load from ...原创 2020-04-10 16:51:01 · 5829 阅读 · 0 评论 -
C/C++ malloc()和calloc()有啥区别
sizeOfElement)有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小。malloc函数:不能初始化所分配的内存空间,在动态分配完内存后,里边答数据是随机的垃圾数据。calloc函数:能初始化所分配的内存空间,在动态分配完内存后,自动初始化该内存空间为零。size)函数有一个参数,即要度分配的内存空间的大小。malloc函数:函数返回值是一个对象。calloc函数:函数返回值是一个数组。malloc函数:malloc(calloc函数:calloc(原创 2020-04-10 15:19:24 · 705 阅读 · 0 评论 -
C/C++的#define DEBUG 用法
【代码】C/C++的#define DEBUG 用法。原创 2020-04-09 16:52:28 · 2790 阅读 · 0 评论 -
C/C++ gdb的使用
用于展示gdb的调试功能,主要包括断点设置,单步执行,汇编代码显示等功能。2. (gdb) break 1: 设置断点,在源程序第1行处。6. (gdb) p i: 打印变量i的值,print命令简写。9. (gdb) c: 继续运行程序,continue命令简写。3. (gdb) info break: 查看断点信息。5. (gdb) n: 单条语句执行,next命令简写。4. (gdb) r: 运行程序,run命令简写。7. (gdb)bt: 查看函数堆栈。10. (gdb) q: 退出gdb。原创 2020-04-09 16:52:54 · 1147 阅读 · 0 评论 -
C/C++取绝对值实例
输出结果:k1=1.00,k3=2.03。原创 2020-03-28 23:17:22 · 3219 阅读 · 0 评论 -
C/C++日志写入系统log(/var/log/syslog)
【代码】C/C++日志写入系统log(/var/log/syslog)原创 2020-02-24 15:51:26 · 4397 阅读 · 1 评论 -
C/C++ Exit Codes(错误码)
【代码】C/C++ Exit Codes(错误码)原创 2020-02-24 15:19:04 · 1472 阅读 · 0 评论 -
C/C++语言函数参数里的“...”作用,va_list的使用(stdarg.h)
可变参数的实现方式:C语言头文件“stdarg.h”提供了一个数据类型va_list和三个带参数的宏(va_start,va_arg和va_end)。va_start使得va_list类型的vp指向第一个可选参数,va_arg返回参数列表的当前参数并使vp指向参数列表的下一个参数,va_end把vp指针清为NULL。函数sum的功能是求前n个可变参数的和,所以对于函数调用“sum(4,3,2,3,4,5,6)”返回值应该为前4个可变参数的和,即为2+3+4+5=14。输出结果: j=14。原创 2020-01-16 16:37:43 · 806 阅读 · 0 评论 -
C/C++的ide编译器CLion的安装及快捷键使用
下载首先去Jetbrains官网下载CLionhttps://www.jetbrains.com/clion/download/我下载的是2019.2版本,主要是为了授权授权修改hosts文件:C:\windows\system32\drivers\etc添加两行内容在最后0.0.0.0 account.jetbrains.com0.0.0.0 www.jetb...原创 2020-01-14 16:20:39 · 1220 阅读 · 0 评论 -
C/C++从路径得到目录名文件名
【代码】C/C++从路径得到目录名文件名。原创 2019-12-02 18:02:29 · 1915 阅读 · 0 评论 -
C/C++中从文件末尾反向读取N行文件记录(末尾读取文件)
最近在实际的开发项目遇到了一个问题,有个24小时在跑的Linux程序,会不断有日志输出,写到一个指定的日志文件中。但是,日志只提供了输出的功能,并没有读取日志文件的功能。如果给程序员自己看日志是很简单的,只需要用tail 或 vi 即可。但是现在有个需求,需要在程序的界面上显示日志文件的内容,而且是最近的100行记录。在网上搜索了一遍,总结一下:1:从文件头开始,先用getline函数获取每一...原创 2019-11-07 16:40:24 · 4783 阅读 · 1 评论 -
C/C++ getopt()函数的介绍及使用
对于这个过程会调用三次getopt()函数,和第一个输入一样,是找到选项-b和他的参数"qing er",这时optind的值为3,也就意味着,下一次的getopt()要从argv[3]开始搜索,所以第二次调用getopt()函数,找到选项-c和他的参数1234(选项和参数是连在一起的),由于-c1234写在一起,所以他两占一起占用argv[3],所以下次搜索从argv[4]开始,而argv[4]为空,这样第三次调用getopt()函数就会返回-1,循环随之结束。这就要涉及到main函数的那两个参数了,原创 2019-09-12 18:19:50 · 2869 阅读 · 3 评论 -
atexit()函数(进程退出函数,类似析构)
atexit函数:atexit函数是一个特殊的函数,它是在正常程序退出时调用的函数,我们把他叫为登记函数(函数原型:int atexit (void (*)(void))) 一个进程可以登记若32个函数,这些函数由exit自动调用,这些函数被称为终止处理函数,atexit函数可以登记这些函数。exit调用终止处理函数的顺序和atexit登记的顺序相反,如果一个函数被多次...原创 2019-08-28 17:30:39 · 495 阅读 · 0 评论 -
C/C++ stat()函数:获取文件状态
26、S_ISSOCK (st_mode) 是否为socket 若一目录具有sticky 位 (S_ISVTX), 则表示在此目录下的文件只能 被该文件所有者、此目录所有者或root 来删除或改名.12、S_IRUSR (S_IREAD) 00400 文件所有者具可读取权限。13、S_IWUSR (S_IWRITE)00200 文件所有者具可写入权限。14、S_IXUSR (S_IEXEC) 00100 文件所有者具可执行权限。22、S_ISREG (st_mode) 是否为一般文件。原创 2019-09-12 18:58:16 · 2494 阅读 · 0 评论 -
C/C++函数指针与回调函数总结(函数指针数组)
函数有它的地址,程序运行起来了,程序里肯定有地方要放这个函数。我们知道可以用printf %p来输出一个变量的地址,数组的地址,同样我们定义了一个函数后,用这个函数的名字做输出,就可以得到这个函数的地址。那么我们得到一个函数的地址,有什么用呢? 我们可以想一下,在程序里我们定义一个变量i,然后定义一个指针p,让指针p指向i得到i的地址,然后通过*p我们就可以对i...原创 2019-09-17 15:25:55 · 1078 阅读 · 0 评论