C语言的传参形式:

  1. .在C中,无法确定传递函数的所有实参时,可以用省略号代替形参列表
    void hello(…);
    void world(list,…);

va_list: 指的是传入的参数列表 原型是 typedef char *arg;
va_start: 是一个宏定义,利用指针推算出其他参数的地址

原理:
在内存中栈结构是 自上而下的,所以函数的参数写入的顺序是根据谁先写在前面,因为编译器是自左向右编译写入的
例如 :int hello(int a,int b,int c) 实际在内存中的位置就是a在栈顶,c在栈顶,a是低地址,c是高地址,这也符合栈的数据结构先进后出的特性,所以就可以以最近写入的地址(函数的栈顶地址),推算出其他参数的地址,然后使用相关的参数
va_end : 可以理解成free函数,但是两者的机理不太一样,所以为了好理解,就当他是free吧

#这个地方写错了,根据linux内核的分配传参规则,第一个参数最后入栈,对C来讲所有的函数传参过程操作都是这样,这样就可以保证按照正常,我理解的传入顺序进行对应

参考《深入linux内核架构》:
以下是书中原文:

总结:
linux 系统编程的时候,代码量一大 ,错误就不太好定位,所以 这种方式我们通常是用来写log的,用来定位,硬件驱动程序或者设备监控程序的错误。
(如果你是用的是vim的话可以通过Youcomplete看到这些函数和声明的原型)

实例程序举例:

#include<stdio.h>
#include<stdarg.h>void testLog(char*format,...)
{char tmp[50];va_list argsList;va_start(argsList,format);vsnprintf(tmp,sizeof(tmp),format,argsList);va_end(argsList);printf("%s\n",tmp);}int main(void)
{testLog("%d%d%d%d%d",1,2,3,4,5);return 0;
}

常见到的缓冲区:
缓冲区溢出(buffer overflow),是针对程序设计缺陷,向程序输入缓冲区写入使之溢出的内容(通常是超过缓冲区能保存的最大数据量的数据),从而破坏程序运行、趁著中断之际并获取程序乃至系统的控制权。
缓冲区:输入输出数据的临时存储
fflush()可以清空缓冲区的缓存,也就是临时存储的数据

gcc 关于编译器的几个宏定义总结 :
#ifdef GNUC //指的是检查编译器的版本,是否符合要编译的版本(一般都会附加在头文件中,为不同的编译环境的准备)

attribute 的使用(不是经常用到,但是可以让C用的更灵活):
下面是写的很全的两个连接大家可以看看
https://www.cnblogs.com/embedded-linux/p/5801999.html
https://blog.csdn.net/weixin_38233274/article/details/82188997
也可以去官网 GNUC 里面的使用会更加全面

C linux 深入学习 errorfunction的创建相关推荐

  1. Linux入门学习(六)—— 怎么更改文件的所有者、所属组?以及怎么更改系统创建的默认权限?

    引言:上期回顾(想要学习的童鞋可以点击看看) 关于文件的入门操作这是最后一个章节,如果是新手从第一章开始安装linux系统学习,到上一章学会修改文件的权限,那我相信之前的文章对你是所有帮助的.之前有介 ...

  2. Linux内核学习总结

    作业一计算机是如何工作的进行http://www.cnblogs.com/zhengwei0712/p/5207299.html 作业二操作系统是如何工作的进行http://www.cnblogs.c ...

  3. 详解Linux交互式shell脚本中创建对话框实例教程

    详解Linux交互式shell脚本中创建对话框实例教程 本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一 ...

  4. Linux.NET学习手记(2)

    上一回合,我们讨论学习了如何在Linux环境中搭建能够供.NET运行的环境,不知道各位读者是否已经完成了环境的搭建?不过,无论各位读者是采用我们上回合介绍的方法还是采用网上提供的其他方法搭建Linux ...

  5. linux系统管理学习笔记之一-------linux解压缩命令

    linux系统管理学习笔记之一-------linux解压缩命令 2009-12-29 11:52:55 标签:linux tar [推送到技术圈] 版权声明:原创作品,允许转载,转载时请务必以超链接 ...

  6. Linux内核学习--内存管理模块

    Linux内核学习--内存管理模块 首先,Linux内核主要由五个部分组成,他们分别是:进程调度模块.内存管理模块.文件系统模块.进程间通信模块和网络接口模块. 本部分所讲的内存是内存管理模块,其主要 ...

  7. linux操作系统学习网站整理(100个)

    linux操作系统学习网站整理(100个) 评选出的这100个优秀站点,将按照下述20个类别作以评介: (一) 文件下载 (二) 幽默娱乐 (三) 相关新闻 (四) 通用硬体 (五) 专用硬体 (六) ...

  8. flayber正文 再谈如何学习Linux,一线Linux专家学习经验谈

    记得最早接触linux是在2000年,那个时候,还在上大学,一个同学从荷兰回来,带回来了一个Linux的拷贝版,记得版本还是Redhat6.2.曾经为安装一个系统让我们忘记疲劳,挑灯夜战,不亦乐乎.那 ...

  9. linux进程的环境变量,LINUX系统学习一(进程、MMU,环境变量、getenv、fork、getpid/ge...

    LINUX系统学习一(进程.MMU,环境变量.getenv.fork.getpid/ge LINUX系统学习一(进程.MMU,环境变量.getenv.fork.getpid/getppid.ps.ki ...

最新文章

  1. android 背景图太大,android – 背景图片需要太长时间才能画(Canvas)Jerky Sprites ……?...
  2. JavaScript创建对象的方法
  3. 亲测吃知乎月饼变身“喷射战士”,我给大家科普一下发生甚么事了
  4. 分布式缓存之Memcache
  5. 汇编语言随笔(6)-大小写转换与实验6(双重循环:需要保存cx值)
  6. textaligncenter仍然不居中_戊唑醇和己唑醇都是杀菌剂,有啥不同?真正懂的人不多...
  7. thinkPHP增删改查的方法案例
  8. UILabel自适应高、宽
  9. springMVC分析-2
  10. P5904-[POI2014]HOT-Hotels加强版【长链剖分,dp】
  11. linux的程序员计算器,linux中的计算器
  12. H.264的NALU,RTP封包说明(转自牛人)
  13. mysql 与QT的连接
  14. wx:for双层循环
  15. Windows系统 services.msc命令详解,Windows命令行查看本地服务
  16. 雷军:执掌金山纯属意外
  17. 记录一次不同接口之间并发导致的生产问题
  18. <2021SC@SDUSC> 开源游戏引擎 Overload 代码模块分析 之 OvGame (一)—— 概况与 .rc 文件
  19. win7共享xp打印机_打印机共享那些事儿……
  20. videoleap自带素材_videoleap教程:制作电影帷幕开场效果细解

热门文章

  1. 强大的API测试工具Hitchhiker v0.9 基于UI的断言测试,回顾2017
  2. h5 移动端 常见 重要问题记录
  3. 深入理解Kinect for Windows开发
  4. Android小项目之---选择对话框(附源码)
  5. .net System.Web.Caching.Cache缓存类使用详解(转载)
  6. 木兰编程语言python_国产编程语言木兰换皮Python 中科院重罚当事人
  7. 架空输电线路运行规程_[精品课程]金具的种类架空输电线路设计
  8. java Date.getTime()返回负数异常情况分析
  9. client软件怎么卸载 nac_如何彻底卸载在 Mac 上安装的一个软件?
  10. idea 文件流读取web-inf下的文件_C#初学者教程系列20:Stream流读写