C 编程
文章平均质量分 61
C 编程
hjjdebug
西方用26个字母表示世界,计算机用0,1两个数字表示世界,大道至简!
人类用6号元素碳来思考, 计算机用14号元素硅来演算,精妙绝伦!
展开
-
cpu 信息的获取(c代码)
1. 如果用c 获取cpu 个数呢?推荐get_nprocs()2. 获取cpuid,做为机器的唯一性标识,只能用内联汇编原创 2024-08-08 10:23:12 · 621 阅读 · 0 评论 -
free() 从哪里知道释放的内存大小.
小结:实际上系统为每块分配的内存加了一个16字节的头部信息. 并把最终的大小按16字节对齐长度用8字节就够了,但系统保留了16字节长度中bit0的1 其是没什么意义.由于有以上过程,所以你申请的内存大小并不完全等于头部记录的大小, 记录的总比你申请的要大一点点.所以你就不用斤斤计较为什么我申请的内存大小与头部记录的大小不是完全想等的了.原创 2024-07-25 11:42:14 · 416 阅读 · 0 评论 -
errno 是个啥?
1. errno 是一个宏,2. errno 是一个函数调用返回的整数值.3. __errno_location() 是个啥?4. errno 是一个全局变量吗?不是,它是线程变量.5. 怎样得到errno 对应的错误信息? strerror(errno).6. errno 在系统中是如何定义的?7. errno 的应用实例参考.原创 2024-07-14 11:00:55 · 718 阅读 · 0 评论 -
计算机中浮点数表示float 与 double
默认float 及 double 均输出6位数值。//%f 与 %lf 输出一样,精度可到15位。原创 2024-05-22 11:17:08 · 173 阅读 · 0 评论 -
c语言bit位定义--位域的分配是怎样的?
little-endian位域的分配是把最先定义的bit位分到了最低位的bit上, 把最后定义的bit放到了最高位的bit上.编译器认为bit位跟外部包装它的unsigned int 没有半毛钱关系, 你认为有关系,它认为那是强加给它的,它不承认原创 2024-03-29 14:42:47 · 609 阅读 · 0 评论 -
带semaphore的buffer 应用实例
这是一个项目的缩减版.该项目内容是以一个恒定的码率去发送文件. 项目运行的很好,但是当在文件所在磁盘大量长时间 copy 文件时, 由于有大量磁盘读写操作,干扰了以恒定码率发送文件. 出现码率抖动. 意味着画面可能会卡顿.所以需要在外边包上一个外壳, 让外面的这个线程专门去抢磁盘资源, 放入缓存.则内层可以以恒定码率读取缓存,完成发送.这里对缓存的管理就引入了一个重要概念.gSemBufObj 对象. 带semaphore的缓存的管理对象.经实验效果不错. 分享这个模型代码以飨读者.原创 2024-03-18 10:25:35 · 740 阅读 · 0 评论 -
线程的通俗解释
1. 什么是线程? 2. 线程函数长得什么样? 3. 为什么要使用线程.4. 线程控制. 4.0 线程的执行和挂起 4.1: 线程中的互斥操作 4.2: 线程中的同步操作 4.3: 为什么不用全局变量作线程间控制变量? 4.4: 全局变量在线程同步或互斥中没有立足只地吗? 4.5: 线程的创建与销毁原创 2024-03-17 17:33:27 · 622 阅读 · 0 评论 -
创建线程时指定线程属性,调整线程优先级
//用attr 来创建thread, 设置线程优先级//查看指定进程各线程优先级$ ps -p 8996 -T -o tid,comm,rtprio//查看所有线程优先级$ ps -e -T -o tid,comm,rtprio | grep -v -原创 2024-03-12 13:01:05 · 478 阅读 · 0 评论 -
获取秒值, 把秒值转换为时分秒, 及把时分秒转换成秒值代码
获取秒值, 把秒值转换为时分秒, 及把时分秒转换成秒值// 使用就这么简单.// 有时候程序输出需要打印时间信息, 就可以这么干了.原创 2024-03-01 15:36:04 · 277 阅读 · 0 评论 -
c/c++中 qsort 与 bsearch 算法的使用
二进制搜索一个key, 在BASE地址, 元素个数NMEMB, 元素大小SIZE,比较函数__COMPAR。* 由于这个表是我们人类方便查阅的方式给出的,为了编程的需要,先把它按月份名称的ascii顺序排序,bsearch 二分搜索方法,是需要一个排序的数组的,所以先排序数组,然后让bsearch 搜索key。bsearch 在/usr/include/stdlib.h 中定义, 就在qsort 函数的上方。qsort 用来排序,bsearch用来搜索,是这个意思,但具体怎样使用呢?原创 2023-12-13 17:58:10 · 643 阅读 · 0 评论 -
sizeof 与 strlen 用法的简明解释
1. strlen() 是函数, 程序会根据传入的指针计算字符串的长度,不带尾部0.2. sizeof() 不是函数, 其括着的部分可以是变量或类型或字符串,把它也叫参数吧, gcc 会计算出参数所需占用的内存的大小.原创 2023-11-15 09:54:27 · 100 阅读 · 0 评论 -
linux 下用posix semaphore 解决资源竞争问题实例
让10个线程竞争5个资源,用semaphore 来实现1. sem_init(信号量,num) 初始化资源数2. 每个线程要 sem_wait(信号量) 申请资源,申请不到会等待3. 用完要sem_post(信号量), 归还资源原创 2023-09-20 09:54:59 · 270 阅读 · 0 评论 -
linux 应用中offsetof ()是个啥?
//总结: linux 应用中 offsetof 是在stddef.h 中定义的一个宏//#define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER)原创 2023-09-13 13:43:21 · 219 阅读 · 0 评论 -
linux 下输出彩色字符串
地球人都都知道, \e是转移,其值8进制是\033,十进制是27,16进制是1B。\033[1m 设置高亮度。\033[30m----\33[37m 设置前景色。\033[40m----\33[47m 设置背景色。\033[0m 关闭所有属性。中间[和m之间的数值为属性,其意义主要就是上面介绍的.4ym 设置,x,y取值为0-7。//红字绿底,hello world。原创 2023-07-27 11:40:34 · 432 阅读 · 0 评论 -
linux 下va_start,va_end,va_arg,va_list这些宏到底是什么?
// va_start,va_arg,va_end,及 va_list 都是__builtin_ 内置变量// 都依赖于编译器的实现, 成了黑箱操作了.//// 在简易内核linux0.11 上 , va_*操作并不是黑箱操作,而是显示定义的.如下:// va_list args: va_list被定义成char *, 即args 为一个char *// va_start(args,para)初始化 args 为第一个参数地址+1. 下一个参数地址// va_arg(args,type),原创 2023-07-27 11:01:02 · 540 阅读 · 0 评论 -
qsort 使用举例
/第1参数:数组地址, 第2参数:数组个数,第3参数:数组元素大小,第4参数:比较函数。int cmp(const void *a,const void *b) //比较函数只能是这样的声明.//cmp决定顺序, 返回0(第一项在后)原创 2023-07-09 15:51:37 · 141 阅读 · 0 评论 -
errno 5追踪.
再打开文件,看到了35到133的错误号定义,它包含了一个文件 #include -> /usr/include/asm-generic/errno-base.h。打开,我们看到了错误号125 - 133的定义, 还有一个包含文件 -> /usr/include/linux/errno.h。-5, 这种小号的错误值是ffmpeg 把系统错误号取反形成的,原创 2023-06-29 14:36:39 · 328 阅读 · 0 评论 -
linux c语言创建多级目录
/* mkdir 一次只能创建一级目录,怎样创建多级目录. * 用access 判断目录是否已经创建. * 用mkdir逐级创建目录 */#include <stdio.h>#include <string.h>#include <unistd.h>#include <sys/stat.h>int mkdirs(char *path) { char str[512]; strncpy(str, path, 512);.原创 2022-03-08 16:43:46 · 3062 阅读 · 2 评论 -
linux 下的帮助接口argp_parse()实战
", 目前只定义了一个可选参数OPTION_ARG_OPTIONAL, 类型为"NUM", 工作运行良好, 已经可以应付一般的帮助要求了.就是说,库里边定义了argp_program_version变量,但它的值是NULL,如果用户也定义了argp_program_version,并且不为0,我们知道,命令行除了可以带选项,还可以带参数,每当系统分析到参数时,也会回调parse_opt, 并传递key参数为ARGP_KEY_ARG,选项能够改变程序的运行轨迹,而帮助系统需要让用户知道有哪些选项可以使用。原创 2022-10-21 13:27:55 · 1481 阅读 · 0 评论 -
怎样检测程序中有没有使用未初始化的变量?
怎样检测程序中有没有使用未初始化的变量?打开gcc 的 -Wall 选项, 可以静态检查是否使用了未初始化变量.但并不能查出动态的变量(例如变量指针所指的成员变量)是否初始化.下面给一个例子说明该问题.想要检查一些执行时的内存错误,可以借助于valgrind 等内存检查工具...原创 2022-06-12 16:27:52 · 1015 阅读 · 1 评论 -
linux 命名管道创建及使用demo程序
/* demonstrate how to use thread and how to use fifo etc * 1. write thread is main thread * 2. create a read thread * 3. use fifo to commnicate * 4. display processID and threadID */原创 2022-06-08 10:13:28 · 211 阅读 · 0 评论 -
分解命令行字符串为argc和argv
有时候需要用空格把一个命令行参数字符串分解为参数个数和参数指针,就是常见的c语言main 函数入口argc, argv[], 这里采用strtok()函数可以很方便的做到.char *strtok(char *str, const char *delim);用来将字符串分割成一个个片段。参数str指向欲分割的字符串,参数delim则为分割字符串中包含的所有字符。当strtok()在参数str的字符串中发现参数delim中包涵的分割字符时,则会将该字符改为\0在第一次调用时,strtok()必需给予参数.原创 2022-06-03 15:11:17 · 772 阅读 · 1 评论 -
c语言如何将stdin、stdout、stderr重定向到/dev/null
如何将stdin、stdout、stderr重定向到/dev/null网上有这样描述的.close( 0 );close( 1 );close( 2 );open( "/dev/null", O_RDWR );dup( 0 );dup( 0 );我用到的, 由于某程序向stderr中打印了大量信息,我需要把它代码中的stderr重定向为空.下面给一个实例,#include <stdio.h>#include <stdlib.h>#include <原创 2022-05-29 15:27:47 · 1080 阅读 · 0 评论 -
static 变量名称有何特别之处? 为什么可以重名?
问题: static 变量名称有何特别之处? 为什么可以重名?我们拿一段代码研究一下:#include <stdio.h>void fun1(){ static int a=9; a++; printf("%d",a);}void fun2(){ static int a=5; a++; printf("%d",a);}int main(){ fun1(); fun2(); return 0;}其对应的汇编代码如下;000000000原创 2022-05-23 11:13:01 · 872 阅读 · 0 评论 -
vsprintf 函数研究--可变参数列表
vsprintf 函数研究--可变参数列表函数原型:int vsprintf(char *string, char *format, va_list param);看不懂的就是va_list找一个实例代码做测试, 如下例.$ cat main.cpp#include <stdio.h>#include <stdarg.h>char str[50];/* 这个函数是可变参数的, 其堆栈可以传递很多参数 */int vspf(const char*fmt,原创 2022-05-05 15:25:59 · 549 阅读 · 0 评论 -
c 程序堆与栈,全局变量地址的研究.
c 程序堆与栈,全局变量地址的研究.先来一段简单的测试程序.int main(){ int i=1; int j=2; int k=3; char *p=(char *)malloc(10); printf("global addr gi:%p,gj:%p, gk:%p\n",&gi,&gj,&gk); printf("malloc p:%p\n",p); printf("addr i:%p,j:%p, k:%p\n",&i,&j,&原创 2022-05-02 14:47:42 · 459 阅读 · 0 评论 -
enum 变量的使用及char*数组新式定义
enum 变量的使用及char*数组定义直接上代码, 可以看出, 用enum变量 及等于号可以确定指针所在的位置,如果不用enum变量,按常规定义成 : const char * hw_type_name[]={"cuda","drm",....} 这种方式指针是顺序排放的, 而用enum加=号则按enum 的顺序排放了, 用gdb调试观察hw_type_names 变量可以清楚d看明这一点. cat test.c#include <stdio.h>enum AVHWDe原创 2022-04-15 10:55:20 · 715 阅读 · 0 评论 -
__wrap_malloc 研究
__wrap_malloc 研究即__malloc_hook 不推荐使用后, 用什么办法来在malloc 之前来注入代码呢?gcc/g++ 的链接选项 -Wl,--wrap-malloc 可以解决这个问题. 下面给出一个具体的实例来包装malloc, 包装free, 甚至包装任意一个函数.它的作用是,在调用一个真实的库函数之前, 先调用包装函数.先看一下主体代码, test.cpp中调用了 foo(), malloc(),free()函数.$ cat test.cpp #include原创 2022-04-10 20:34:09 · 1834 阅读 · 2 评论 -
malloc_hook 研究.
研究了一下__malloc_hook, 你可以用man __malloc_hook 获取它的第一认识.原来它是glibc 定义的一组变量(函数指针), 由此而去调用对应的函数, 这就叫hook.把这个hook 定义到哪里,它就会调用到哪里,于是就理解了这个hook, 下面给出一个完成的示例加深理解, 是参考手册写出的代码,调试通过.可以理解为也是一种代码注入手段. 用以检查内存泄露等!源码: cat main.cpp #include <stdio.h>#include原创 2022-04-07 10:22:58 · 2633 阅读 · 0 评论 -
m3u8 文件代码片段.
m3u8 文件代码片段. 备用.//写分片的最大持续时间,分片的序号int write_m3u8_header(FILE *fp, const myoption_t opt) { char write_buf[1024]; snprintf(write_buf, 1024, "#EXTM3U\n#EXT-X-VERSION:3\n#EXT-X-TARGETDURATION:%05lu\n#EXT-X-MEDIA-SEQUENCE:%d\n", (long)opt.segment_ma原创 2022-02-17 13:25:54 · 808 阅读 · 0 评论 -
c 语言释放0地址是合法的.
我原来以为访问非法内存地址是非法的,包括0地址, 今天才发现,free(0)地址是允许的. 这算是一个特例吗? 测试代码如下:$ cat main.c#include <stdio.h>#include <stdlib.h>int main(){ free(0); printf("pass test 0\n"); free((void *)1); printf("pass test 1\n"); return 0;}运行结果如下:./mempa原创 2022-01-22 15:07:08 · 963 阅读 · 0 评论 -
strtok() 用法的深入研究.
/ 当第一个字符(包括后续连续字符)就是分界符时, strtok并没有把它替换为0, 而是跳过,把返回值指向了下一个非分界符字符位置,把后续的第一个分界符置为0. 就是说首部分界符会跳过.//每调用一次,都是首部分界符跳过,后续第一个分界符置0. 直到字符串尾返回空。/* 当我在写一个删除字符串尾部的\r,\n 字符函数时, 发现strtok 并没有按我特定的想法走,//若第一个字符不为分界府,则把找到的后面第一个分界符若有的话,置为0,并在内部记录下一个查找点位置.//返回字符串首地址。原创 2020-08-12 13:41:08 · 417 阅读 · 0 评论 -
在循环体内定义简单变量,和在循环体外定义简单变量效率是一样的
在循环体内定义简单变量,和在循环体外定义简单变量效率是一样的.因为简单变量并不存在创建和释放的过程,只是在栈上预留内存空间见下例示范.$ cat main.cpp#include <stdio.h>#include <string.h>int main(){ for(int i=0; i<5;i++) { char buf...原创 2020-03-28 17:19:57 · 938 阅读 · 1 评论 -
size_t 到底是什么类型(有图有真相)
比hello 还简单的程序. 主要是为了分析一下预处理结果#include <stdio.h>int main(){ ssize_t a=5; return 0;}想看一看stdio.h中都包含了什么?想看一看ssize_t 到底是什么类型.好说,做一下预处理即可,生成main.cpp.igcc 预处理后面的数字官方参考链接https://g...原创 2019-08-29 15:20:00 · 2255 阅读 · 0 评论 -
字符全排列的另一种实现
乘法原理是说,选第一个数有n种可能, 第二个数n-1种可能,第三个数n-2个可能... 第n数1种可能。到网上查了一下,网上的全排列算法,大部分是基于交换原则,由递归算法来给出答案。我这里给出另一个算法,是基于乘法原理和数据结构来给出结果。则总的可能数为: n * (n-1)(n-2)...*1 = n!说实话,该程序是在递归函数中,使用了数据交换。典型的穷举搜索算法。朋友让我帮忙写一个密钥空间的穷举,我想到了全排列。似乎该方法更容易理解,且很形象。原创 2010-10-18 16:39:00 · 737 阅读 · 0 评论 -
windows下创建网络共享文件例子
创建网络共享文件例子原创 2011-03-04 10:04:00 · 807 阅读 · 0 评论 -
关于计算机中无符号数,有符号数的注意事项
简言之:计算机用4byte 表示数据,其格式为用补码表示。下面是知识背景及描述。计算机是用补码表示数据的,正数的补码是其本身。负数的补码是其正数按位取反再加1. 模通常是32位。注意。char *, 当其值大于80时,会扩展其符号位。形如:0041141E原创 2011-08-29 09:25:33 · 1117 阅读 · 0 评论 -
linux 动态链接库的创建和使用--动态连接
/* * author: hjjdebug * date: 2012 * title: linux 动态链接库的创建和使用--动态连接*/动态连接,就是由调用者显式调用指定库,并获取对应库的函数入口地址linux 动态链接库的创建和使用1. 先创建一个动态链接库。源码如下:$ cat max.cppextern "C"{ int max(i原创 2012-03-25 17:01:57 · 3968 阅读 · 0 评论 -
linux 动态链接库的创建和使用
/** author: hjjdebug* date: 2012* title: linux 动态链接库的创建和使用--静态连接*/静态连接,不需要用户额外写代码,链接程序(gcc等)链接时指明动态连接库,并将所有外部符号从连接库中都找到。linux 动态链接库的创建和使用1. 先创建一个动态链接库。源码如下:$ cat max.cppint max(int a, int ...原创 2019-11-26 10:37:16 · 1211 阅读 · 2 评论 -
演示vc动态链接库的创建和使用
演示动态链接库的创建和使用原创 2011-03-04 11:19:00 · 757 阅读 · 0 评论