常用C语言常识

本文档详细介绍了C语言的基础知识,包括#define的使用、结构体定义、switch...case...语法、!!运算符的作用、常用标准库函数、errno.h、typedef、字符串拼接、strcmp与strncmp的比较,以及线程参数传递、线程ID和进程ID的打印、内存管理、堆栈概念等。同时,文档涵盖了Linux内核模块编写、内核头文件、printk的使用、内核延迟、snprintf函数、结构体数组初始化等多个内核相关主题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常用C语言常识

目录

常用C语言常识... 1

1       C语言基础:... 1

1.1        #define末尾无需;1

1.2        结构体定义末尾需要;1

1.3        switch...case...1

1.4        !!的作用... 2

1.5        C语言中最常用标准库函数... 2

1.6        errno.h. 2

1.7        typedef3

1.8        字符串的拼接... 3

1.9        strcmp与strncmp. 3

1.10          在一个目录下搜索以"nvmerr_"开头的所有文件,并打开此文件... 3

1.11      pthread_create传递线程参数需要注意的问题... 4

1.12          打印线程和进程id. 5

1.13          指针空间的申请和释放... 5

1.14      C语言中对某指针变量未进行初始化和对他以NULL处理有什么区别... 5

1.15          堆和栈... 6

1.16          结构体数组的清零或者初始化... 6

1.17          结构体之间是可以直接赋值的... 6

1.18          包含结构体的结构体大小... 6

1.19      32位和64位下的sizeof()7

1.20          结构体指针... 7

1.21          结构体列举... 8

1.22      char[]数组的赋值或初始化... 8

1.23      TAILQ队列... 8

1.24      __attribute__. 8

1.25      C语言数据类型打印对应的占位符... 8

1.26          大端和小端... 8

1.26.1       什么是大端,什么是小端:8

1.26.2       为什么会有大小端:9

1.26.3       大小端在内存中的存放方式举例:9

1.26.4       如何测试编译器是大端还是小端... 9

1.27      extern关键字... 9

1.28      pthread 线程立即取消的两种方法... 10

1.29      pthread_create主线程与创建的新线程之间退出关系... 11

1.30          获取当前时间... 11

1.31      open函数错误信息获取... 12

1.32      open函数返回值判断... 12

1.33          结构体数组的初始化或置0操作... 13

2       Linux内核... 13

2.1        内核模块的编写... 13

2.2        linux:lib/modules/2.6 存放的代码跟usr/src/2.6.18存放的代码分别是什么... 14

2.3        Linux内核模块间函数调用正确方法... 14

2.4        可加载模块的gdb调试... 15

2.5        可加载模块的kgdb调试... 15

2.6        内核中的延迟... 16

2.7        snprintf函数用法... 16

2.8        内核输出printk的输出格式... 16

2.9        printk的打印级别... 16

2.10          内核常用头文件... 17

2.11          内核中的file结构... 17

2.12      struct file_operations的release()的注意事项... 18

2.13      I/O复用-每次调用select()前都要重新设置一下待检测的描述字... 18

2.14          内核环境安装等操作命令... 18

2.15      yum源... 19

2.16      PCI中bus,dev,func的取值... 20

2.17      PCI驱动程序... 20

2.18      Makefile选项... 20

2.19      Linux命令... 20

 


 

1        C语言基础:

1.1    #define末尾无需;

       #define SYSAGT_SYSIF_ERR_UE   1000

 

1.2    结构体定义末尾需要;

     struct nvme_io_channel {

             struct spdk_nvme_qpair *qpair;

             struct spdk_poller   *poller;

     };

 

1.3    switch...case...

    int value = 1;

    switch(value){

    case 1:

    case 2:

       printf("2\n");

       break;

    case 3:

    case 4:

       printf("4\n");

       break;

    上述代码的结果是:2

         case1什么也不做,直接执行下一个case的代码

        

         intvalue = 7;

   switch(value){

   case 1:

   case 2:

      printf("2\n");

      break;

   case 3:

   case 4:

      printf("4\n");

      break;

    上述代码的结果是:

         空,因为没有匹配项,所以什么也不做

 

1.4    !!作用

   !!(-2) = 1

   !!(9) = 1

   !!(0) = 0

   其实就是将所有非0的数转化为1

 

1.5    C语言中最常用标准库函数

  http://blog.youkuaiyun.com/j8121/article/details/52946980 

  

1.6    errno.h

     #define EPERM           1      /* 没有操作权限 */

          #define ENOENT          2     /* 没有这样的文件或目录 */

          #define ESRCH            3     /* 没有这样的进程 */

          #define EINTR            4      /* 系统调用被信号中断 */

          #define EIO              5      /* I/O错误 */

          #define ENXIO            6     /* 没有这样的设备或地址 */

          #define E2BIG            7      /* 参数列表太长了 */

          #define ENOEXEC         8     /* 执行文件格式错误 */

          #define EBADF            9     /* 文件号错误 */

          #define ECHILD          10     /* 没有子进程 */

          #define EAGAIN           11     /*稍后再试 Try again */

          #define ENOMEM         12    /* 内存溢出 */

          #define EACCES           13     /* 文件权限不允许Permissiondenied */

          #define EFAULT           14     /*非法地址 Bad address */

          #define ENOTBLK         15     /* Block device required */

          #define EBUSY          16     /*设备或者资源已经被使用 Device or resource busy

          #define EEXIST           17     /* 文件已存在 File exists */

          #define EXDEV           18     /* Cross-device link */

          #define ENODEV         19     /*没有这样的设备 No such device */

          #define ENOTDIR         20    /* 不是一个目录 Not a directory */

          #define EISDIR           21     /* 是一个目录Is a directory*/

          #define EINVAL          22      /*无效参数 Invalid argument */

          #define ENFILE          23      /* 文件个数超出 File tableoverflow */

          #define EMFILE         24     /* 打开的文件数超过设定值 Too many open files /

          #define ENOTTY        25       /* Not a typewriter */

          #define ETXTBSY        26      /* Text file busy */

          #define EFBIG          27      /* File too large */

          #define ENOSPC        28      /* No space left on device */

          #define ESPIPE         29      /* Illegal seek */

          #define EROFS         30      /* Read-only file system */

          #define EMLINK        31      /* Too many links */

   #define EPIPE          32      /* Broken pipe */

          #define EDOM         33      /* Math argument out of domain of func */

         #defineERANGE         34       /* Math result not representable */ 

 

1.7    typedef

typedef作用是为一个数据类型定义一个新名字,包括int,char和自定义的类型。与#define的不同在于typedef在编译时被解释。

  如:typedef  unsigned char      uint8_t;

  当typedef作用于结构体时,如:

 typedef struct Student

  {

   ...

 }Stu;

  用的时候直接Stustu1(这里Stu相当于struct Student,所有struct Student都可以直接用Stu代替)

 

1.8    字符串的拼接

  char *filename = (char*)malloc(sizeo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值