Linux C编程
文章平均质量分 80
X_s_yu彧
一个想要搞点名堂出来的小白。
关于小白的博客,如有问题,欢迎批评指正。邮箱地址:[email protected]
展开
-
Linux中的两个经典宏定义
(04) (size_t)(&(((TYPE*)0)->MEMBER)) 结果转换类型。这两个宏最初是极客写出的,后来在Linux内核中被推广使用。(03) &( ( (TYPE *)0 )->MEMBER ) 取出数据成员的地址。(01) ( (TYPE *)0 ) 将零转型为TYPE类型指针,即TYPE类型的指针的地址是0。(02) ((TYPE *)0)->MEMBER 访问结构中的数据成员。:获得结构体(TYPE)的变量成员(MEMBER)在此结构体中的偏移量。转载 2023-05-11 19:33:29 · 293 阅读 · 1 评论 -
Linux学习笔记(4)--一些内核宏定义
是Linux内核源代码中的一个宏,它的作用是将一个符号(函数、变量、结构体等)导出为公共的符号,以便在内核模块中使用。Linux内核中采用模块化设计,允许在运行时加载和卸载内核模块,这些模块相对独立,并且被限制在一个特定的内存区域内,不能访问其他模块的代码和数据,也不能被其他模块调用。导出一个符号时,该符号会被添加到内核符号表(kernel symbol table)中,并被标记为可导出的(exportable),其它模块可以直接通过符号名引用该符号,而无需在代码中手动链接它。具体来说,当内核模块使用。原创 2023-05-11 15:04:12 · 1382 阅读 · 0 评论 -
Linux网络编程学习笔记(1)
1、bzero()函数:将指定字符串s的前n个字节为零。#include <string.h> void bzero(void *s, int n);2、memset()函数:将指针变量 s 所指向的前 n 字节的内存单元用一个“整数” c 替换,直接操作内存空间,常用于内存初始化# include <string.h>void *memset(void *s, int c, unsigned long n);3、atoi()函数:将字符串转换成整型数,返回.原创 2021-10-17 21:35:42 · 137 阅读 · 0 评论 -
Linux学习笔记(1)--用户态与内核态
在内核态下,进程或线程可以访问受到限制的资源和设备,直接访问操作系统内核空间,即所有资源,并可以执行一些特权操作,如读写硬件设备、管理进程和文件系统等等。用户态进程通过调用一个特定的函数(如read、write等)来发起系统调用请求,此时CPU会切换到内核态运行,操作系统会根据请求进行相应的处理,处理完成后再切换回用户态,把结果返回给对应的进程。在Linux系统中,内核空间和用户空间是分开的,用户态程序不能直接调用并操作内核代码或数据,只能通过系统调用接口向内核发出请求。2、用户态与内核态的交互。原创 2023-04-24 23:26:42 · 968 阅读 · 0 评论 -
Linux学习笔记(3)一些数据类型
与此类似,还有__aligned_u32、__aligned_u16等数据类型,分别用于定义32位和16位无符号整数类型变量并指定它们的对齐方式。uintptr_t的实现方式根据操作系统或者编译器而有所不同,但是通常情况下,它被实现为一个足够大的整数类型,足以存储任何指针。需要注意的是,在使用uintptr_t时,必须注意指针的正确性,避免指针越界等问题。其中__是指这是一个内核定义的类型,be表示大端字节序,即Big-endian,32表示这是一个32位的数据类型。原创 2023-04-24 19:59:17 · 2424 阅读 · 0 评论 -
Linux学习笔记(2)--一些内核接口
RCU是一种经典的读写锁算法,用于保护共享的数据结构,它的特点是在读的过程中不需要获取锁,在写的过程中通过复制一份数据来保证读操作不受写操作的影响。当一个线程或进程执行 wait_for_completion() 函数时,如果它所等待的事件还没有完成,那么就会进入睡眠状态(即挂起当前线程或进程),直到所等待的事件完成,并调用 complete() 函数告知等待队列中的所有等待者事件已经完成为止。具体来说,当内核中的某个结构体需要在多个地方被引用,通过使用 kref 引用计数器可以追踪该结构体被引用的数量。原创 2023-04-19 09:49:33 · 788 阅读 · 0 评论