|
内核开发中C语言技巧
介绍
static变量static静态全局变量仅仅在某个C程序文件中访问,具有文件的作用域,这样可以降低耦合性。 如果普通变量在函数中定义和初始化则这个变量作用域仅仅限于这个函数内;如果函数的变量申明为static这个变量则是static局部变量,它不会暴露给其他的函数使用。 static变量有一个特性就是整个生命周期内只会被初始化一次,在设计模式中中单例模式在C语言实现中可以借助static变量来实现。
static函数
inline函数
函数指针指针的本质是指向一个内存地址,这个地址存储一段代码的首地址。一般函数指针的有2个用途,(1)直接使用函数指针调用函数,比如linux内核的vfs中的inode,inode会有2个操作一个是file操作一个是dir操作.比如在下面例子ext4_dir_inode_operations用于目录的操作。当用户态发起mkdir到了内核的vfs层,在vfs层调用的是函数指针.mkdir.,而这个函数实际指向的是ext4_dir_inode_operations对应的ext4_rmdir这个函数。
- const struct inode_operations ext4_dir_inode_operations = {
- .create = ext4_create,
- .lookup = ext4_lookup,
- .link = ext4_link,
- .unlink = ext4_unlink,
- .symlink = ext4_symlink,
- .mkdir = ext4_mkdir,
- .rmdir = ext4_rmdir,
- .mknod = ext4_mknod,
- .tmpfile = ext4_tmpfile,
- .rename = ext4_rename2,
- .setattr = ext4_setattr,
- .getattr = ext4_getattr,
- .listxattr = ext4_listxattr,
- .get_acl = ext4_get_acl,
- .set_acl = ext4_set_acl,
- .fiemap = ext4_fiemap,
- .fileattr_get = ext4_fileattr_get,
- .fileattr_set = ext4_fileattr_set,
- };
复制代码
- void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*);
- void *bsearch( const void *key, const void *array, size_t n, size_t size,
- int (*compare)(const void *, const void *));
复制代码
双重指针
内核开发中C语言技巧 - int main(int argc, char **argv)
- {
- // todo
- }
复制代码
- // 函数执行完毕后,修改的是ptr的副本,ptr自身没有修改
- void self_malloc(int *ptr){
- ptr = malloc(1);
- }
复制代码- // 这样修改的是双重指针指针的内容,函数执行完毕后*ptr得到的是malloc的内存地址
- void self_malloc2(int **ptr){
- *ptr = malloc(1);
- }
复制代码
|
+10
|