常用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.csdn.net/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(sizeof(char) * 32);
char *name ="string";
char num = "20";
char *suffix =".bin"
strcpy(filename, name);
strcat(filename, num);
strcat(filename, suffix)
这样就可以拼接成:string20.bin
1.9 strcmp与strncmp
strcmp与strncmp都是用来比较字符串的,区别在于能否比较指定长度字符串。
int strcmp (const char *s1,const char *s2)
//这个函数用来比较s1和s2字符串,两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止。
//若str1==str2,则返回零;str1> str2,则返回正数;若str1< str2,则返回负数。
int strncmp (const char *s1,const char *s2, size_t size)
//strncmp函数是指定比较size个字符。也就是说,如果字符串s1与s2的前size个字符相同,函数返回值为0。