C
文章平均质量分 60
花一样的阿衰
不思进取的底层码农
展开
-
【2.5】exec函数族
exec函数族原创 2022-09-24 09:44:35 · 335 阅读 · 0 评论 -
【3】IO复用:select和poll
IO复用:select和poll原创 2022-09-23 22:27:31 · 535 阅读 · 0 评论 -
【2】多进程TCP并发服务器
多进程TCP并发服务器原创 2022-09-23 15:42:49 · 187 阅读 · 0 评论 -
linux C读写锁
Linux C读写锁原创 2022-09-07 15:25:05 · 422 阅读 · 0 评论 -
C 单链表
C 单链表原创 2022-08-26 17:18:57 · 537 阅读 · 0 评论 -
C 顺序表
C 顺序表原创 2022-08-23 17:23:52 · 187 阅读 · 0 评论 -
win线程互斥
使用WaitForSingleObject实现,线程1和线程2之间互斥,仅能运行一个线程。如下代码在VS2019 MFC下运行,static BOOL g_NeedCacncel = FALSE;HANDLE g_Mutex = NULL;// OnInitDialog中调用initvoid CWinThreadTestDlg::init() { g_Mutex = CreateMutex(NULL, false, NULL);}// close时候调用uninitvoid CWinTh原创 2022-05-18 17:00:37 · 200 阅读 · 1 评论 -
gtest和gmock使用方法
gtest使用方法原创 2022-02-09 17:02:31 · 1913 阅读 · 0 评论 -
C函数指针
写法void (*func)(int value);使用方式下面的四种方式都是一样的效果,都可以输出value = 10#include <stdio.h>void (*func)(int value);static void myFunc(int value) { printf("myFunc value: %d\n", value);}static void test01() { func = myFunc; func(10);}stat原创 2022-01-03 11:54:25 · 384 阅读 · 0 评论 -
C语言实现8bit raw data转换为png
实现代码如下#include <dirent.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include "svpng.h"static int g_image_width = 0;static int g_image_height = 0;/* 寻找文件路径中最后的 / */int last_mark(char原创 2021-03-03 09:59:24 · 1370 阅读 · 0 评论 -
POSIX定时器使用方法
定时器API函数定义int timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid); /* 创建定时器 */int timer_gettime(timer_t timerid,struct itimerspec *value); /* 初始化定时器 */int timer_delete(timer_t timerid); /* 删除定时器 */参数介绍clockid_t clock_id有如下几种选择。原创 2020-05-30 16:48:28 · 1659 阅读 · 0 评论 -
C语言条件编译
根据宏定义来区分代码编译如果宏XXX被定义,则执行编译#ifdef XXX#endif如果宏XXX未被定义,则执行编译#ifndef XXX#endif如果宏XXX被定义或者宏YYY被定义,则执行编译#if defined (XXX) || defined (YYY)#endif如果宏XXX被定义或者宏YYY未被定义,则执行编译#if defined (XXX) || ...原创 2020-03-23 15:47:17 · 153 阅读 · 0 评论 -
C语言从字符串中提取数字和其他字符
从字符串"100+200-50*2/5"中提取出来数字和运算符#include <stdio.h>#include <stdlib.h>#include <string.h>int analysis_data(const char *str, int *value, int *value_count, char *operator, int *oper...原创 2020-03-17 17:03:50 · 10844 阅读 · 3 评论 -
详解C指针(函数的值传递和地址传递)
以下所有叙述如果有错误,烦请评论指正变量、变量名、地址、指针、普通变量(以整型int为例)、指针变量1、变量:变量可以看做是一个容器,这个容器用来存放数据,变量存放在内存中2、变量名:变量名实际上是一个地址的符号,当程序编译的时候,操作系统会为变量在内存中分配内存空间,所以每一个变量都会有一个实际的内存地址。系统将变量名和内存地址关联起来,这样我们在操作变量名的时候,实际操作的其实是内存中某...原创 2019-05-27 14:26:31 · 8403 阅读 · 5 评论 -
Posix 信号量 sem_t
说明参考博客:POSIX信号量代码如下:#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <pthread.h>#include <semaphore.h>sem_t g_sem;stat...原创 2019-05-24 10:23:05 · 394 阅读 · 0 评论 -
Linux下获取malloc实际分配的内存大小
使用的函数原型如下:#include <malloc.h>size_t malloc_usable_size(void *_ptr)做了如下测试void malloc_test(){ char *array = (char *)malloc(1 * sizeof(char)); int ntem = malloc_usable_size(array); ...原创 2019-06-13 10:45:01 · 7578 阅读 · 0 评论 -
利用mtrace来定位memory leak
mtrace 来自GNU(分配内存必须使用glibc的内存分配函数,,使用方法比较简单,例子如下:#include <stdlib.h>#include <stdio.h>#include <mcheck.h>void mtrace_test(){ char *array = (char *)malloc(100 * sizeof(char)...原创 2019-06-13 11:20:05 · 348 阅读 · 0 评论 -
Linux C 互斥锁的使用
互斥锁的作用保护共享数据: 在并发机制的情况下,有时候会有多个线程同时访问同一片数据,为了保护数据操作的准确性就需要通过加锁来进行保护。保持操作互斥: 可能一个程序会有多个操作,但是同一个时间只能有一个操作被执行,例如a/b两个操作,如果a被执行,b就不能被执行,同理b被执行,a就不能执行操作函数pthread_mutex_t lock; /* 互斥锁定义 */pthread_mute...原创 2019-06-13 14:45:22 · 23086 阅读 · 0 评论 -
Linux C 回调(callback)函数
callback:即回调函数,是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。实例如下:callback.h中声明callback函数:#ifndef __CALLBACK_H__#d...原创 2019-06-13 15:02:20 · 5699 阅读 · 0 评论 -
Linux设置printf颜色
#include <stdio.h>/*显示:0(默认)、1(粗体/高亮)、22(非粗体)、4(单条下划线)、24(无下划线)、5(闪烁)、25(无闪烁)、7(反显、翻转前景色和背景色)、27(无反显)颜色值:0(黑)、1(红)、2(绿)、 3(黄)、4(蓝)、5(紫)、6(深绿)、7(白)颜色分为背景色和字体色,30~39(30+颜色值)用来设置字体色(前景色),40~49...转载 2019-06-14 13:55:18 · 663 阅读 · 0 评论 -
变量作用域
变量根据定义位置的不同,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域。全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包括全局变量定义的源文件需要用extern关键字再次声明这个全局变量。静态局部变量具有局部作用域。它只被初始化一次,自从第一次初始化直到程序与你新内阁结束都一直存在,他和全...原创 2019-06-14 16:44:17 · 1571 阅读 · 0 评论 -
标准IO的操作函数
FILE *fp = NULL;FILE *fopen(const char *path, const char *mode);size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *s...原创 2019-06-14 18:28:50 · 310 阅读 · 0 评论 -
Linux 下获取目录下的所有文件
#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <dirent.h>static int get_files(){ DIR *dirp; struct dirent *dp; dirp = opendir("."); if ...原创 2019-06-14 18:35:24 · 3080 阅读 · 0 评论 -
字符串和16进制之间的转换
在串口传递数据的时候数据格式是16进制的,但是存下来的数据为了方便查看,用字符串存储下来了。例如串口传递的数据是0xAA 0xBB 0xCC,存储下来的文件为AABBCC,这样存储带来的问题就是无法直接通过串口再发送出去,所以需要转换一下。在实现转换之前,先看一个16进制和字符的对应关系,如下所述。用16进制打开一个文件如下图:文件的大小是5个字节为啥文件里面以01作为一个字节呢,其实是...原创 2020-04-08 10:17:45 · 74540 阅读 · 6 评论 -
获取和改变当前工作目录
获取当前工作目录:char *getcwd(char *buf, size_t size);改变工作目录:int chdir ( const char *path );实例#include <stdio.h>#include <unistd.h>#include <string.h>int main(int argc, char const...原创 2019-07-01 17:35:33 · 865 阅读 · 0 评论 -
offsetof和container_of的介绍
offsetof定义//include/linux/stddef.h#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)目的获得结构体(TYPE)的变量成员(MEMBER)在此结构体中的偏移量用法#include <stdio.h>#define offsetof(TYPE, ME...原创 2019-06-27 15:08:14 · 169 阅读 · 0 评论 -
快速排序
基本逻辑以从小到大排序为例:找到一个基准值,然后把比基准值大的放左边,比基准值小的放右边,直至基准值左边全部比基准值小,右边全部比基准值大为止。然后以现基准值为分界线,左右两边分别重复此过程。 代码步骤调用排序函数的函数中1、定义数组头和数组尾排序函数中1、定义基准值和基准下标2、定义从数组头移动的下标和数组尾部移动的下标3、比较数组尾部和基准值,如果比基准值小,则双方...原创 2019-07-19 15:35:57 · 63 阅读 · 0 评论 -
函数指针和指针函数
函数指针定义:函数指针是一个指针,指针指向的是一个函数。写法:void (*func)(int, int);用法:#include <unistd.h>#include <stdio.h>void(*callback_t)(int event_id);void func(int event_id){ printf("event_id: %d\n"...原创 2019-08-07 10:02:55 · 182 阅读 · 0 评论 -
System V信号量
操作函数的定义参考博客:信号量函数(semget、semop、semctl)及其范例代码如下:#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <pthread.h>#include <sys/sem....原创 2019-05-24 10:18:57 · 314 阅读 · 0 评论 -
Linux TAILQ队列
链表删除节点,参考:关于TAILQ链表节点删除问题#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <pthread.h>#include <sys/queue.h>/* TAILQ_I...原创 2019-05-24 10:12:22 · 1813 阅读 · 0 评论 -
宏定义中使用for循环
typedef struct list_data { int value;} list_data_t;#define list_for_each(data) \ int i; \ for (i = 0; i < data.value; i++) { \ printf("hello world\n"); \ }int main(int ...原创 2019-06-05 10:56:15 · 9034 阅读 · 0 评论 -
C语言基础知识
C语言基础知识字节(byte)和bit的区别bit:比特是表示信息的最小单位,是二进制数的一位包含的信息或2个选项中特别指定1个的需要信息量。只有2种状态即0和1。byte:计量存储容量的一种计量单位,通常情况下一字节等于8 bit常用数据类型所占bit数类型bit数int32short16long32char8枚举枚举类型是一种基本...原创 2019-03-16 14:29:40 · 188 阅读 · 0 评论 -
数组和指针
一维数组和指针int array[3] = {1, 2, 3}printf("&array:%p array:%p &array[0]:%p\n", &array, array, &array[0]);&array表示的是整个数组的地址,array表示数组首地址,&array[0]第一个元素地址。三者打印出来的值都是相同的,但是表示的空间不同...原创 2019-03-16 17:45:12 · 89 阅读 · 0 评论 -
实现不定参函数
#include <stdlib.h>#include <stdio.h>#include <stdarg.h>int print_log(const char *format, ...){ char string[256] = {0}; va_list args; va_start(args, format); vs...原创 2019-04-11 09:29:50 · 432 阅读 · 0 评论 -
Linux获取时间的方法
#include<time.h> int main() { time_t timep; struct tm *p; time (&timep); p = gmtime(&timep); printf("%d\n",p->tm_sec); /*获...原创 2019-04-11 15:03:22 · 3855 阅读 · 0 评论 -
Linux C获取当前工作目录
获取当前工作目录#include <stdio.h> #include <unistd.h> int main() { char buf[80]; getcwd(buf,sizeof(buf)); printf("current working directory: %s\n", buf); ...原创 2019-04-12 10:26:13 · 2688 阅读 · 1 评论 -
linux C获取键盘信息
#include <stdio.h>#include <unistd.h>#include <termios.h> static struct termios initial_settings, new_settings;static int peek_character = -1;void init_keyboard(void);void clo...原创 2019-04-12 11:12:37 · 5495 阅读 · 4 评论 -
C实现system函数,获取执行的结果
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>void my_system(const char *cmd){ char result[10240] = {0}; char buf[1024] = {0}; FILE ...原创 2019-05-20 11:26:30 · 8803 阅读 · 0 评论 -
通过二级指针来构建二维数组
二维数组可以看做是多个一维数组组合而成,例如3行4列的二维数组,可以看作是由3个数组长度为4的一维数组组合而成。代码如下:#include <stdlib.h>#include <stdio.h>#include <unistd.h>#include <string.h>#define ARRAY_LINE 3#define ARRAY...原创 2019-05-27 14:57:29 · 831 阅读 · 0 评论 -
位域
在C语言中,占空间最小的类型是char类型,占8bit。某些情况下,因空间有限,一个char类型中的不同bit要代表不同的信息,通过位移来操作起来很麻烦,容易出错,这个时候就要用到位域,简单方便#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>...原创 2019-05-27 15:50:59 · 115 阅读 · 0 评论