- 博客(53)
- 收藏
- 关注
原创 自动创建设备节点udev机制实现
4.创建存放设备节点信息的文件后,系统会自动在驱动发起一个hotplug event事件,用户空间存在一个进程hotplug,hotplug会被唤醒,hotplug通知udev进程,udev会去创建的向上提交的设备节点信息目录里查询设备节点相关信息。udevd守护程序收到uevent事件后,创建一个设备类,(向上提交目录信息),会在内核中申请一个struct class对象,并且初始化,然后会在根目录下/dev/class下创建一个文件夹,/dev/class/类名。功能:销毁设备节点信息。
2023-09-12 21:07:58
42
原创 C高级DAY3
三、输入一个文件名,判断是否为shell脚本文件,如果是脚本文件判断是否有可执行权限,如果有可执行权限则运行文件,如果没有可执行权限则给文件添加可执行权限。六、输入学生成绩,判等级,A[100,90),B[90,80),C[80,70),D[70,60)七、写一个shell脚本,获取当前用户名,用户ID和工作路径。五、终端输入用户,判断用户是否存在,如果不存在则添加用户。八、统计/etc目录下以P或p开头的文件的个数。二、判断家目录下普通文件和目录文件的个数。四、终端输入两文件名,判断哪个文件更新。
2023-08-05 19:32:42
139
原创 IO day3作业
6.使用read、write拷贝文件。11.多次使用open打开文件。3.使用O_EXCL创建文件。12.使用dup2实现拷贝。10.使用dup拷贝文件。8.对图片数据的读写。
2023-06-25 20:54:52
10
原创 【无标题】
说明:在程序执行前7秒是,只有父进程,并处于休眠状态,pid为:127343, 7秒后,执行fork时,会拷贝127343进程得到进程127346进程,此时,相当于a.out就有两个进程,这两个进程,同时执行while(1),此时,才会造成两个进程都处于运行态。进程的创建过程,是通过拷贝父进程得到的,进程在内核空间是通过task_struct结构体表述的,新进程在创建过程中,直接拷贝父进程的该结构体得到,只需要稍作修改即可,保留了父进程大部分的遗传信息,这个拷贝过程,被封装在fork函数中。
2023-05-31 02:32:05
49
1
原创 第二章,进程线程
动态体现在:在使用gcc编译时,会将你的文件和库文件的索引表一起生成一个可执行文件,程序的体积一般比较大,但是在执行程序的过程中,就需去找该库所在位置了,效率较低。静态体现在:在使用gcc编译时,会将你的文件和库文件一起生成一个可执行文件,在最终的可执行程序中,包含了静态库,程序的体积一般比较大,但是在执行程序的过程中,就无需去找该库所在位置了,效率较高。进程:进程是动态的,有生命周期,是程序的一次执行过程,每个进程拥有0--3G的用户空间,并且共享3--4G的内核空间。
2023-05-30 02:09:44
73
原创 I/O day3
使用变量拷贝文件描述符,其实只是拷贝变量的值,并没有产生新的文件描述符,只是在程序中多了一个变量,记录该文件描述符而已,所以无论操作哪个变量,都是对该文件描述符的操作,使用的是同一个光标。1> 文件描述符是一个大于等于0的非负整数,使用open打开一个文件后,就会返回该文件的描述符,在之后想要操作文件,只需通过该文件描述符即可。基于系统调用的方式,只要调用文件IO的接口,程序就会从用户空间向内核空间进行一次交互,效率相比于标准IO较低,原因是没有缓冲区。使用read、write实现两个文件的拷贝。
2023-05-26 23:09:23
117
原创 I/O day2 作业(接第一天)
2> 行缓存:跟终端相关的操作使用的是行缓存(stdin、stdout),其大小为1024字节。3> 不缓存:跟标准出错有关的操作是不缓存(stderr),其大小为0。3、当输入输出发生切换时,会刷新行缓存。5、手动刷新缓存区时,行缓存会进行刷新。3、当输入输出发生切换时,会刷新全缓存。4、当关闭文件指针时,也会刷新行缓存。6、当缓存区满了后,会自动刷新缓存区。4、当关闭文件指针时,也会刷新全缓存。6、当缓存区满了后,会自动刷新缓存区。5、手动刷新缓存区时,会刷新全缓存。2、程序结束后,自动刷新行缓存。
2023-05-25 22:36:05
168
原创 I/O 课程DAY1
3.系统提供的特殊文件指针:stdin(标准输入)、stdout(标准输出指针)、stderr(标准出错)在文件IO或标准IO相关接口被调用是,如果出错了,操作系统会给应用程序返回一个错误码,一共又4096,每一个代表不同的错误。1> IO的课程需要学习很多接口(函数),大概有100个左右,需要大家多记、多练,每天要完成思维导图绘制。2> 行缓存:跟终端相关的操作使用的是行缓存(stdin、stdout),其大小为1024字节。不同的系统,进入内核空间的方式是不同的,所以,接口函数有所不同。
2023-05-24 22:59:30
154
原创 day3
数据:被计算识别、存储、处理的符号。【整数、小数、字符串、汉字、声音、图片、视频,文件,app等】数据元素:由数据项组成,是数据基本单位数据项:是数据的最小单位数据对象:由类型相同的数据元素组成数据> 数据对象>数据元素>数据项数据结构:存储数据元素之间一种或多种关系的集合D_S=(D,R)逻辑结构:表示一种或多种关系集合结构:数据元素之间没有关系【地铁上的人】线性结构:数据元素之间存在一对一的关系【地铁上的座位】头结点无前驱,尾结点无后继,其他结点唯一的前驱,唯一的后继树形结构:数据元素之间存在一对多的关
2023-05-16 23:31:12
11
原创 数据结构作业
char str[]="hello"//str全局 初始化 str空间在.data段,字符串hello在只读段,把只读段的值复制一份给str //可以通过str修改值。char *p="hello"//全局 初始化 p在.data段,字符串常量hello在ro段,指针p直接指向字符串常量的首地址 //不可以改变。//q在栈区,malloc申请4字节空间在堆区,通过指针q指向堆区空间的首地址。char *p="hello"//p在栈区,字符串hello在只读段,通过指针p指向只读段hello的首地址。
2023-05-16 01:12:57
23
原创 【无标题】
3> 指针指向函数时,通过p调用,表示通过函数首地址直接调用函数,*p调用,表示通过函数首地址取值,根据值调用函数,注意:***p这里面的*个数可以是任意的。void sum(int a,int b)//有参无返函数 void (*p)(int a,int b) -->void (*p)(int,int)int sum(int a,int b,float c)//有参有返函数 int (*p)(int ,int,float)函数名(参数变量名);
2023-05-12 01:21:38
15
原创 指针 作业
int arr[5];&arr[0]:数组第一个元素的地址arr:数组名表示数组的首地址,也就是第一个元素的地址arr=&arr[0]&arr:表示整个数组的首地址/p=arri<3;i++)//arr++:错误:数组的首地址arr表示常量//地址的等价关系:i<3;
2023-05-10 00:19:43
17
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人