
C/Linux C
文章平均质量分 72
rayylee
awk 'BEGIN{O="o"~"o";o="O"=="O";O+=+o;o_+=o""o;for(;++_o!=o_-O;)O_=O_"%c";printf(O_,o_*(o_-o)+O+O,o_*(o_-O)-O,o_*o_,o_*o_,o_*(o_-o)-O,o_*(o_-O)+O,o_*(o_-O)+O,o_-o)}'
展开
-
dpdk无锁队列rte_ring实现分析
rte_ring的实质是FIFO的无锁环形队列,无锁队列的出队入队操作是rte_ring实现的关键。常用于多线程/多进程之间的通信。ring的特点:无锁出入队(除了cas(compare and swap)操作);多消费/生产者同时出入队。原创 2023-02-03 18:01:59 · 1457 阅读 · 0 评论 -
Linux下大页HugePages与透明大页Transparent HugePages
Linux下的大页分为两种类型:标准大页(Huge Pages)和透明大页(Transparent Huge Pages)。 Huge Pages有时候也翻译成大页/标准大页/传统大页,它们都是Huge Pages的不同中文翻译名而已,顺带提一 下这个,免得有人被这些名词给混淆、误导了。原创 2022-12-21 22:00:12 · 6222 阅读 · 0 评论 -
Linux-0.11内核学习-添加系统调用
1、参考资料赵炯博士的网站oldlinuxLinux内核完全注释Linux0.11 源码2、概要操作系统作为软件应用层和底层硬件之间的部分,向下提供服务,向上提供接口。系统调用便是操作系统向上层应用提供的操作底层硬件的和核心服务的接口,也就是API(Application Programming Interface)。我们知道一般API实现的方法是提供函数接口,只需要调用函数就可以实现相应的功能,底层的原理是程序地址的跳转。因为操作系统和用户程序同时存在于内存中,我们当然是不希望操作系统的数据原创 2021-01-18 18:21:35 · 1471 阅读 · 0 评论 -
C语言位域(位段)详解
有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。例如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位。正是基于这种考虑,C语言又提供了一种叫做位域的数据结构。在结构体定义时,我们可以指定某个成员变量所占用的二进制位数(Bit),这就是位域。请看下面的例子:struct bs{ unsigned m; unsigned n: 4; unsigned char ch: 6;};:后面的数字用来限定成员变量占用的位数。成员 m翻译 2021-01-15 15:37:21 · 1342 阅读 · 0 评论 -
Linux Kernel Git国内镜像源
1. Linux Kernel Git 镜像使用帮助本项目包含三个镜像:linux.git, linux-next.git, linux-stable.git,分别是主分支、稳定版分支和开发分支。在使用时,请自行更改路径中相应的仓库名称。如需克隆主线 linux 代码,使用git clone https://mirrors.tuna.tsinghua.edu.cn/git/linux.git若要将 tuna mirror 加入已有代码库,可在已有仓库中运行git remote add tuna原创 2020-12-14 16:36:38 · 5428 阅读 · 2 评论 -
C语言的构造函数与析构函数
C++和JAVA中有构造函数,C语言中也有实现的方法,在gcc下可以使用关键字 __attribute__指定构造函数或者析构函数。他们由编译器在编译阶段进行处理。声明构造函数:void __attribute__((constructor)) function(void)声明析构函数:void __attribute__((destructor)) function(void)例:#include <stdio.h>void __attribute__((construct原创 2020-11-16 10:22:49 · 3847 阅读 · 0 评论 -
Linux 64位进程地址空间分布概况
对于Linux 64位系统,理论上,64bit内存地址可用空间为0x0000000000000000 ~ 0xFFFFFFFFFFFFFFFF(16位十六进制数),这是个相当庞大的空间,Linux实际上只用了其中一小部分(256T)。Linux64位操作系统仅使用低47位,高17位做扩展(只能是全0或全1)。所以,实际用到的地址为空间为0x0000000000000000 ~ 0x00007FFFFFFFFFFF(user space)和0xFFFF800000000000 ~ 0xFFFFFFFFFFF原创 2020-11-05 18:38:16 · 15800 阅读 · 4 评论 -
比wget更块的工具mwget
mwget和curl/multicurl一样,m就是multi多线程的意思。mwget是wget的升级版,支持多线程下载。1. 下载及安装# git clone https://github.com/rayylee/mwget.git# cd wget# ./configure# make && make install2. 使用# mwget [URL] // 默认开4个线程# mwget -n 10 [URL] // 10个线程下载...原创 2020-10-11 14:37:58 · 10068 阅读 · 1 评论 -
使用fio测试磁盘I/O性能
使用fio测试磁盘I/O性能PTE前言fio是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎,包括:sync,mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio 等等。简单好用的磁盘性能测试工具测试准备工具:fio- Flexi...转载 2019-11-03 17:15:27 · 893 阅读 · 0 评论 -
Linux 问题故障定位,看这一篇就够了
1. 背景有时候会遇到一些疑难杂症,并且监控插件并不能一眼立马发现问题的根源。这时候就需要登录服务器进一步深入分析问题的根源。那么分析问题需要有一定的技术经验积累,并且有些问题涉及到的领域非常广,才能定位到问题。所以,分析问题和踩坑是非常锻炼一个人的成长和提升自我能力。如果我们有一套好的分析工具,那将是事半功倍,能够帮助大家快速定位问题,节省大家很多时间做更深入的事情。2. 说明本篇文...转载 2019-11-03 16:13:58 · 254 阅读 · 0 评论 -
C内存对齐
一、概念 对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。 二、为什么要字节对齐 需要字节对齐的根本原因在于CPU访问数据的效率问题。假设上面整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果取它的值的话需要访问两次翻译 2013-07-26 09:57:02 · 13800 阅读 · 3 评论 -
再谈strncpy函数--值得一看的好文章
strncpy()函数原型:char*strncpy(char *dest, char *src, int n); 用法:#include 功能:把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。 说明:如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。 如果src的长度小于n个字节,则原创 2015-12-21 18:08:33 · 892 阅读 · 0 评论 -
国嵌视频光盘及源码网盘下载地址-续
由于之前的115网盘不能下载了,现在给大家提供一个最新的链接。第1天:ARM系统开发基础http://pan.baidu.com/s/1bongEGv第1天:硬件访问http://pan.baidu.com/s/1mgZrjfE第2天:按键LED驱动程序设计http://pan.baidu.com/s/1bos6vuf第2天:设备模型原创 2015-12-21 19:03:33 · 9299 阅读 · 6 评论 -
linux C下的setjmp与longjmp介绍
setjmp和longjmp是C语言独有的,只有将它们结合起来使用,才能达到程序控制流有效转移的目的,按照程序员的预先设计的意图,去实现对程序中可能出现的异常进行集中处理。先来看一下这两个函数的定义:#include int setjmp(jmp_buf envbuf);若直接调用则返回0,若从longjmp调用返回则返回非0值setjmp函数用缓冲区e翻译 2016-01-11 10:58:54 · 866 阅读 · 0 评论 -
epoll在ET和LT模式下读写
在一个非阻塞的socket上调用read/write函数, 返回EAGAIN或者EWOULDBLOCK(注: EAGAIN就是EWOULDBLOCK)从字面上看, 意思是:EAGAIN: 再试一次,EWOULDBLOCK: 如果这是一个阻塞socket, 操作将被block,perror输出: Resource temporarily unavailable总结:这个错误表示资源暂转载 2015-10-24 14:21:21 · 532 阅读 · 0 评论 -
C语言宏定义使用技巧
01: 防止一个头文件被重复包含#ifndef COMDEF_H#define COMDEF_H//头文件内容#endif02: 重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。typedef unsigned char boolean; /* Boolean value type. */typedef unsi转载 2015-10-23 17:16:19 · 504 阅读 · 0 评论 -
C语言宏定义##连接符和#符的使用
C语言中如何使用宏C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(而非运行期概念)。下面对常遇到的宏的使用问题做了简单总结。关于#和##在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。比如下面代码中的宏:#define WARN_IF(EXP)转载 2015-10-23 16:44:03 · 494 阅读 · 0 评论 -
Linux下使用fstatfs/statfs查询系统相关信息
Linux下使用fstatfs/statfs查询系统相关信息1. 功能#include int statfs(const char *path, struct statfs *buf);int fstatfs(int fd, struct statfs *buf); 查询文件系统相关的信息。2. 参数path: 需要查询信息的文件系统的文件路径名。fd原创 2015-08-22 14:58:33 · 1946 阅读 · 0 评论 -
使用openssl生成PEM格式私钥和公钥及ECDSA签名
一、生成密钥与读取的过程 /* 生成公钥 */ RSA* rsa = RSA_generate_key( 1024, RSA_F4, NULL, NULL); BIO *bp = BIO_new( BIO_s_file() ); BIO_write_filename( bp, "public.pem" ); PEM_writ转载 2015-08-01 16:54:26 · 9127 阅读 · 0 评论 -
gcc __attribute__关键字举例之visibility
visibility用于设置动态链接库中函数的可见性,将变量或函数设置为hidden,则该符号仅在本so中可见,在其他库中则不可见。 g++在编译时,可用参数-fvisibility指定所有符号的可见性(不加此参数时默认外部可见,参考man g++中-fvisibility部分);若需要对特定函数的可见性进行设置,需在代码中使用__attribute__设置visibility属性。转载 2015-07-13 20:50:59 · 570 阅读 · 0 评论 -
linux下C语言简单实现线程池
0 前言网上关于线程池的例子还是不少,简单明了的倒是比较少,看了网上的资料,打算借鉴网上的一些例子,自己实现以下。线程的概念就不多说,首先说一下多线程的好处:多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。那么为什么又需要线程池呢?我们知道应用程序创建一个对象,然后销毁对象是很耗费资源的。创建线程,销毁线程,也是如此。转载 2015-06-30 19:13:07 · 750 阅读 · 0 评论 -
推荐!国外程序员整理的 C++ 资源大全
关于 C++ 框架、库和资源的一些汇总列表,由 fffaraz 发起和维护。内容包括:标准库、Web应用框架、人工智能、数据库、图片处理、机器学习、日志、代码分析等。 标准库C++标准库,包括了STL容器,算法和函数等。C++ Standard Library:是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分。Standard Te转载 2015-06-03 20:38:12 · 991 阅读 · 0 评论 -
/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.17' not found 解决办法
今天编译一个工程,在目标机上运行app,出现了这个错误。下面我们由这条报错信息入手,寻找问题的答案:1.首先保证程序没有被strip,也就是说可执行程序含有符号表信息。2.出现这个问题的原因是glibc的版本太低,查看系统glibc支持的版本root@ubuntu:/dvr# strings /lib/x86_64-linux-gnu/libc.so.6 | gr原创 2015-05-26 21:18:13 · 69590 阅读 · 7 评论 -
va_list/va_start/va_arg/va_end深入分析
va_list/va_start/va_arg/va_end这几个宏,都是用于函数的可变参数的。我们来看看在vs2008中,它们是怎么定义的: 1: ///stdarg.h 2: #define va_start _crt_va_start 3: #define va_arg _crt_va_arg 4: #define va_end _crt_转载 2015-03-18 22:35:30 · 812 阅读 · 0 评论 -
C++中的(unsigned int)&代表的意思
int &m = i原创 2014-07-01 20:21:14 · 5892 阅读 · 2 评论 -
基于Libevent最小根堆定时器的C++定时器实现
在libevent中定时器的实现是通过基于最小堆的优先级队列来实现的,对于这两个数据结构比较陌生的可以去翻算法导论的6.5节中,主要的源码都在min_heap.c中,下面是C++的实现。数据结构typedef struct min_heap{ struct event** p; unsigned n, a;} min_heap_t;在这个数据结构中 p也就是整个优先级队转载 2016-01-14 17:51:13 · 3884 阅读 · 0 评论 -
IPv6下网络编程实例
一、TCP socket ipv6与ipv4的区别服务器端源代码如下:[cpp] view plain copy#include #include #include #include #include #include #include #include #include转载 2016-02-02 17:19:01 · 3752 阅读 · 1 评论 -
Linux内核调试的方式以及工具集锦
Linux内核调试的方式以及工具集锦优快云 GitHub Linux内核调试的方式以及工具集锦 LDD-LinuxDeviceDrivers/study/debug 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处, 谢谢合作 因本人技术水平和知识面有限, 内容如有纰漏或者需要修正的地方, 欢迎大家指正, 也欢迎大家提供...转载 2019-09-05 18:11:03 · 2425 阅读 · 1 评论 -
关于操作系统中英文切换的.po和.mo介绍
一、文件简介.po文件,.mo文件,.pot文件是由gettext程序生成或者使用的源代码和编译结果。1、.pot文件是一种模板文件,其实质与.po文件一样,其中包含了从源代码中提取所有的翻译字符串的列表,主要提供给翻译人员使用。从源码中扫描得到的翻译模版文件,原始语言取决于源码字符串中使用的自然语言,建议使用英文。纯文本格式;2、.po文件根据 POT ...转载 2019-09-02 17:50:35 · 4173 阅读 · 0 评论 -
Google C++ 编码规范
Google C++ 编码规范很早就已经公开了,李开复也在其微博上公开分享:”我认为这是地球上最好的一份C++编程规范,没有之一,建议广大国内外IT研究使用。“英文版:http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml中文版:http://zh-google-styleguide.readthedocs.or...转载 2018-11-27 14:51:51 · 263 阅读 · 0 评论 -
yylex使用
%{ #include <stdio.h> #include <stdlib.> int num_num = 0; int num_id = 0;%}INTEGER [-+]?[1-9][0-9]*ID [a-zA-Z][a-zA-Z_0-9]*SPACE [ \n\t]%%{INTEGER} { num_num++; pri...原创 2018-09-01 14:48:54 · 7952 阅读 · 3 评论 -
yacc小例子
YACC(Yet Another Compiler-Compiler)是一个LALR(1)分析器自动生成器,是贝尔实验室在UNIX上首次实现,与LEX有直接的接口。此外GNU(GNU is not UNIX)的Bison是对YACC的兼容性扩充。YACC自动构造分析器的模式及作用图:其步骤如下:YACC源程序结构:说明部分%%翻译规则%%给出一个源程序:...转载 2018-09-01 14:37:18 · 2211 阅读 · 0 评论 -
busybox制作根文件系统
#!/bin/bash# https://releases.linaro.org/components/toolchain/binaries/6.2-2016.11/armeb-linux-gnueabi/gcc-linaro-6.2.1-2016.11-i686_armeb-linux-gnueabi.tar.xz# tar –xvf gcc-linaro-6.2.1-2016.11-...原创 2018-08-08 14:23:12 · 412 阅读 · 0 评论 -
QEMU模拟Cortex-A9,运行kernel、rootfs
宿主机:Centos7(Kernel3.10.0)交叉编译工具链:gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabiQEMU:2.0.0Linux kernel:4.4.0busybox:1.27.2安装交叉编译链https://releases.linaro.org/components/toolchain/binaries/6.2-201...原创 2018-08-07 16:32:48 · 1016 阅读 · 0 评论 -
Git下的冲突解决
冲突的产生很多命令都可能出现冲突,但从根本上来讲,都是merge 和 patch(应用补丁)时产生冲突。而rebase就是重新设置基准,然后应用补丁的过程,所以也会冲突。git pull会自动merge,repo sync会自动rebase,所以git pull和repo sync也会产生冲突。当然git rebase就更不用说了。冲突的类型逻辑冲突转载 2017-02-14 16:25:08 · 531 阅读 · 0 评论 -
Makefile的编写
代码目录:add/add_int.cadd/add_float.cadd/add.hsub/sub_int.csub/sub_float.csub/sub.hmain.c文件main.c#include #include "add.h" #include "sub.h"intmain(void){转载 2016-12-01 20:30:30 · 667 阅读 · 0 评论 -
基于Doxygen的C/C++注释原则
基于Doxygen的C/C++注释原则标注总述1.文件头标注2. 命名空间标注3. 类、结构、枚举标注4. 函数注释原则5. 变量注释6. 模块标注7. 分组标注总述华丽的分隔线//---------------------------------------------------------------------------// Platform Defines/转载 2016-09-08 09:36:38 · 472 阅读 · 0 评论 -
圆形缓冲区(循环buffer)实现
用法圆形缓冲区的一个有用特性是:当一个数据元素被用掉后,其余数据元素不需要移动其存储位置。相反,一个非圆形缓冲区(例如一个普通的队列)在用掉一个数据元素后,其余数据元素需要向前搬移。换句话说,圆形缓冲区适合实现先进先出缓冲区,而非圆形缓冲区适合后进先出缓冲区。圆形缓冲区适合于事先明确了缓冲区的最大容量的情形。扩展一个圆形缓冲区的容量,需要搬移其中的数据。因此一个缓冲区如果需要经翻译 2016-05-20 18:05:00 · 19545 阅读 · 1 评论 -
二分法查找有序表中最接近的数值
二分查找(Binary Search): 二分查找又称折半查找,它是一种效率较高的查找方法。 二分查找要求:线性表是有序表,即表中结点按关键字有序,并且要用向量作为表的存储结构。不妨设有序表是递增有序的。实例:二分法查找有序表中最接近的数值/** * 二分法查找递增表中最接近的数 * @return * - 数组下标 成功 * - -1 失败 */i原创 2016-05-24 15:28:04 · 5047 阅读 · 0 评论 -
大数相关计算(c语言版)
语法:int result=factorial(int n); 参数: n: n 的阶乘 返回值: 阶乘结果的位数 注意: 本程序直接输出n!的结果,需要返回结果请保留long a[] 需要 math.h 源程序: int factorial(int n){long a[10000];int i,j,l,c,m=0,w;转载 2016-03-12 10:44:25 · 545 阅读 · 0 评论