现在位置: 首页 > 自动控制 > 工业·编程 > 文章
2019-10-28 22:15 工业·编程 ⁄ 共 1418字 暂无评论
memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下: void *memcpy(void *dst, const void *src, size_t count);  void *memmove(void *dst, const void *src, size_t count);  他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。 一、memcpy函数   ...
阅读全文
2019-10-27 21:13 工业·编程 ⁄ 共 4245字 暂无评论
1、DPDK特点 DPDK全称为Data plane development kit,是一个用来进行包数据处理加速的软件库。与传统的数据包处理相比,DPDK具有以下特点: 1)轮询:在包处理时避免中断上下文切换的开销, 2)用户态驱动:规避不必要的内存拷贝和系统调用,便于快速迭代优化 3)亲和性与独占:特定任务可以被指定只在某个核上工作,避免线程在不同核间频繁切换,保证更多的cache命中 4)降低访存开销:利用内存大页HUGEPAGE降低TLB miss,利用内存...
阅读全文
2019-10-26 20:52 工业·编程 ⁄ 共 1541字 暂无评论
    在Linux内核源码中,实现和链表相关的接口list_entry()时,会调用container_of()宏定义,它的作用是:给定结构体中某个成员的地址、该结构体类型和该成员的名字,来获取这个成员所在的结构体变量的首地址。有点绕,没关系,接着往下看就能明白了。 container_of()宏定义实现如下所示 /** * container_of - cast a member of a structure out to the containing structure * * ...
阅读全文
本文讲解typeof( ((type *)0)->member )的含义,并在此基础上学习offset_of()的用法。 typeof( ((type *)0)->member ) ANSI C标准允许值为0的常量被强制转换成任何一种类型的指针,并且转换的结果是个NULL,因此((type *)0)的结果就是一个类型为type *的NULL指针. 如果利用这个NULL指针来访问type的成员当然是非法的,但typeof( ((type *)0)->member )是想取该成员的类型(有关typeof()的用法可参考这里),所以编译器...
阅读全文
2019-10-24 20:34 工业·编程 ⁄ 共 1571字 评论 2 条
typeof() 是GCC提供的一种特性,可参考C-Extensions,它可以取得变量的类型,或者表达式的类型。 本文总结了typeof()关键字的常见用法,并给出了相应的例子,以加深理解 。 typeof()关键字常见用法 1、不用知道函数返回什么类型,可以使用typeof()定义一个用于接收该函数返回值的变量 #include <stdio.h> #include <stdlib.h> #include <string.h> struct apple{     int weight;   ...
阅读全文
2019-10-23 20:30 工业·编程 ⁄ 共 810字 暂无评论
如果你对sizeof很熟悉的话,那么大可进行类推,sizeof(exp.)返回的是exp.的数据类型大小,那么typeof(exp.)返回的就是exp.的数据类型。值得注意的是在上面的话里我们可以看到,如果编译选项中指定了使用标准C,那么gcc的扩展使用可能会受到影响,不过在gcc编译条件下使用__typeof__依然可以正常工作,这和使用asm是一样的。当然如果是在其他的编译器条件下,这样做也不行了,只能自定义一个macro去使用,也就是说跟gcc没啥...
阅读全文
2019-10-22 18:59 工业·编程 ⁄ 共 4638字 暂无评论
前文已经向大家介绍了用脚本封装系统调用的方法。在本文中,我将向大家介绍使用.c文件封装系统调用的方法。 使用.c文件封装系统调用一般出于以下两个原因:一,系统调用已过时,可以使用新的系统调用替换旧的系统调用。系统调用的语义不变。二,封装后的函数改变了系统调用的语义。 stat系统调用的封装便是原因一的一个例子。 stat系统调用是106号系统调用。使用stat系统调用可以获取文件的属性,但是获取的属性值都是32位的,...
阅读全文
2019-10-21 18:53 工业·编程 ⁄ 共 8749字 评论 1 条
本文所有描述都是基于glibc-2.26。 系统调用 系统调用是程序员接触到的最底层的构建程序的组件。它们由内核实现,提供给程序调用。用户按照其调用规则可以实现调用。 glibc的封装方式 glibc使用了两种方式来封装系统调用。一种是由脚本生成。一种是.c文件。 使用.c文件封装系统调用,是因为封装过程比较复杂,除了按系统调用的调用规则来封装外,还要进行其他处理。而脚本生成则十分简单。只要按照系统调用的调用规则来封装即可...
阅读全文
  本文试图解答系统调用与库函数之间的关系、glibc库函数的实现原理、系统调用的实现原理等知识,本文讲述的CPU架构限定为ARM核心,为什么是ARM呢,原因很简单,X86我不熟。 系统调用概念   从某种程度上来说,操作系统就是一个计算机的资源管理器,也可以理解为一个虚拟的计算机。那么这台虚拟计算机要向外提供功能,就必须提供一些接口,这些接口就是系统调用。   有很多开发人员经常搞不清楚库函数和系统调用...
阅读全文
2019-10-19 07:49 工业·编程 ⁄ 共 2667字 暂无评论
最近在linux下写一个库,是给别人用的,要用到定时器这个功能,而且是多定时器任务的,在windows下实现是很方便的,但是在linux下就遇到了问题,linux下一个进程只能有一个定时器,如果我用了定时器去实现我的任务,那肯定是没问题的,如果用我库的人自己也创建了一个定时器,那么问题就出现了,我的定时器就被覆盖了。 我的功能肯定也受到了影响,所以linux下的定时器是需要解决的。 没办法,我就自己写了一个定时器类似功能的...
阅读全文