包含标签 C/C++ 的文章

c/c++ max/min 4种实现方法

1.简单的宏实现 1 2 #define max(a,b) (((a) > (b)) ? (a) : (b)) #define min(a,b) (((a) < (b)) ? (a) : (b)) 2.内核的宏实现 1 2 3 4 5 6 7 8 9 10 11 12 13 14 /* safe min & max */ /* avoid ++/-- expand twice */ /* compile warning if type diff */ #define min(x, y) ({ \ typeof(x) _min1 = (x); \ typeof(y) _min2 = (y); \ (void) (&_min1 == &_min2); \ _min1 < _min2 ? _min1 : _min2; }) #define max(x, y) ({ \ typeof(x) _max1 = (x); \ typeof(y) _max2 = (y); \ (void) (&_max1 == &_max2); \ _max1 > _max2 ? _max1 : _max2; }) Linux 内核的实现是安全的,避免了 ++/– 计算多次,而且会在编……

阅读全文

线程创建 pthread_create 中自定义参数注意事项

1.函数原型 1 2 int **pthread_create**(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); 本文主要讨论最后一个参数,同时传递多个的问题 (如果只传递一个 int char 等长度小于指针的数据类型,可以直接传,然后在线程内把 (void *) 强制转换) 2.错误示例 是在一本书上看到的,也是写本文的初衷 错误原因: fds_for_new_worker 是局部变量,线程创建异步的,pthread_create 后, else if 也结束……

阅读全文

Linux fork 后 wait 获取子进程结束的状态示例

概览 使用 fork 后,可能需要获取 fork 的进程的运行状况,比如有没有异常、崩溃。 wait 在 man 中关键的描述如下: All of these system calls are used to wait for state changes in a child of the calling process, and obtain information about the child whose state has changed. A state change is considered to be: the child terminated; the child was stopped by a signal; or the child was resumed by a signal. 示例代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46……

阅读全文

Linux 最简单内核模块 Hello World 示例

注: 如果想要按照本篇实践,需要有能运行的arm开发板和对应版本的内核(如果想在Linux主机上编译运行,请参考附1) 1.在相应版本内核的driver目录下新建如下文件 其中文件代码如下: /* hello.c */ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include <linux/init.h>#include <linux/module.h> static int hello_init(void) { printk(KERN_INFO "[init] Can you feel me?\n"); return 0; } static void hello_exit(void) { printk(KERN_INFO "[exit] Yes.\n"); } module_init(hello_init); module_exit(hello_exit); MODULE_AUTHOR("Alan Wang <alan@wrcode.com>"); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("A simple Hello……

阅读全文

C语言结构体初始化的三种方法

示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 #include <stdio.h> struct student_st { char c; int score; const char *name; }; static void show_student(struct student_st *stu) { printf("c = %c, score = %d, name = %s\n", stu->c, stu->score, stu->name); } int main(void) { // method 1: 按照成员声明的顺序初始化 struct student_st s1 = {'A', 91, "Alan"}; show_student(&s1); // method 2: 指定初始化,成员顺序可以不定,Linux 内核多采用此方式 struct student_st s2 = { .name = "YunYun", .c = 'B', .score = 92, }; show_student(&s2); // method 3:……

阅读全文

C语言计算日期间隔天数的经典算法解析

概览 在网上看到了一个计算日期间隔的方法,咋一看很高深,仔细看更高神,很巧妙。 先直接代码吧 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #include <stdio.h>#include <stdlib.h> int day_diff(int year_start, int month_start, int day_start , int year_end, int month_end, int day_end) { int y2, m2, d2; int y1, m1, d1; m1 = (month_start + 9) % 12; y1 = year_start - m1/10; d1 = 365*y1 + y1/4 - y1/100 + y1/400 + (m1*306 + 5)/10 + (day_start - 1); m2 = (month_end + 9) % 12; y2 = year_end - m2/10; d2 = 365*y2 + y2/4 - y2/100 + y2/400 + (m2*306 +……

阅读全文

Linux下C语言计算文件的md5值(长度32)

概览 Google 了好久都没有找到合适的,其实我只需要一个函数,能计算文件的 md5 值就好, 后来找到了 md5.h 和 md5.c 的源文件,仿照别人的封装了个函数(他那个有问题,和 md5sum 计算出来的都不一样)。 废话少说,直接贴代码: (再废一句话,如果只想计算字符串的md5值,把字符串传给 MD5Update 函数一次就好,示例:github) 源码 (github 源码……

阅读全文

libcurl 使用的几个注意事项

注: libcurl 入门指南( the tutorial ): http://curl.haxx.se/libcurl/c/libcurl-tutorial.html 0 为使用的 curl url 添加确定的协议头 原文: If you specify URL without protocol:// prefix, curl will attempt to guess what protocol you might want. It will then default to HTTP but try other protocols based on often-used host name prefixes. For example, for host names starting with “ftp.” curl will assume you want to speak FTP. 1 把 curl_easy_perform() 回调数据直接写到文件中(FILE *) 原文: libcurl offers its own default internal callback that will take care of the data if you don’t set the callback with CURLOPT_WRITEFUNCTION. It will then simply output the received data to stdout. You can have the default callback write the data to a different file handle by passing……

阅读全文

ubuntu/linux mint 创建proc文件的三种方法(四)

在做内核驱动开发的时候,可以使用/proc下的文件,获取相应的信息,以便调试。 大多数/proc下的文件是只读的,但为了示例的完整性,都提供了写方法。 方法一:使用 create_proc_entry 创建 proc 文件(简单,但写操作有缓冲区溢出的危险); 方法二:使用 proc_create 和 seq_file 创建 proc 文件(较方法三简洁); 方法三:使用 proc_create_data 和 seq_file 创建 proc 文件(较麻烦,但比较……

阅读全文

ubuntu/linux mint 创建proc文件的三种方法(三)

在做内核驱动开发的时候,可以使用/proc下的文件,获取相应的信息,以便调试。 大多数/proc下的文件是只读的,但为了示例的完整性,都提供了写方法。 方法一:使用 create_proc_entry 创建 proc 文件(简单,但写操作有缓冲区溢出的危险); 方法二:使用 proc_create 和 seq_file 创建 proc 文件(较方法三简洁); 方法三:使用 proc_create_data 和 seq_file 创建 proc 文件(较麻烦,但比较……

阅读全文

最近文章

分类

标签

其它