Linux
文章平均质量分 76
风掣长空
这个作者很懒,什么都没留下…
展开
-
文件系统理解
inode table:每个文件都有一个inode号,Linux中文件的属性是大小固定一个集合体,struct inode结构体用来储存文件属性,要找到一个文件,就要找到文件的inode号,inode号是以分区为单位的,也就是说,在一个分区中,inode号是唯一的,而inode table存放的就是文件的inode号,目录文件=属性+内容,我们知道,一个目录下不能有同名文件,查找文件的顺序是先有文件名,再找到inode号,所以是通过文件名来映射inode号,那么,我们inode编号是怎么来的呢?原创 2024-10-13 17:36:11 · 279 阅读 · 0 评论 -
stderr和磁盘理解
发现stdout打印到log.txt了,但是stderr还是打印到显示器上,因为我们重定向的是把文件标识符1给log.txt,而stderr的文件标识符是2,所以不影响,还是打印到显示器上,有了扇区对应的下标,我们就可以在磁盘中找到对应的文件了,对于操作系统来说,和磁盘交互时的基本单位是4KB,也就是8个连续的扇区,这8个连续的扇区称为块,磁盘,放在磁盘的文件就叫做磁盘文件,那么如何在磁盘中存储文件呢?磁盘读写的基本单位是扇区,大小一般是512字节,如何找到一个指定位置的扇区呢?原创 2024-10-13 17:35:35 · 389 阅读 · 0 评论 -
重定向的本质
会发现,本来应该打印到显示器上的内容,打印到文件"myfile"里面了,这是因为我们关闭了文件描述符1,然后打开一个文件,myfile的文件描述符就是1,所以,printf默认是向stdout输出的,但是stdout指向的文件描述符是1,所以就打印到myfile文件中了,这种现象叫做重定向输出。会发现fd是0或者2 ,可见文件描述符的分配规则是找到当前没有被使用的最小的一个下标,作为新的文件描述符,当我们打开一个文件,他的fd是3,因为0 1 2 已经被占用了,当我们关闭0 和 1 ,再看这段代码。原创 2024-09-29 13:01:24 · 287 阅读 · 0 评论 -
文件标识符fd
..:如果我们第二个参数使用了O_CREAT,那么第三个参数表示创建文件的权限,它通常与umask相结合来确定文件的最终权限,比如umask为0,第三个参数设置成0666,表示文件权限是rw-rw-rw-,我们用“w"的方式打开log.txt文件,如果这个文件不存在,就创建这个文件,如果文件存在,就把这个文件内容清空然后打开。我们理解了,每一个文件标识符标识一个文件,那么fd 0 1 2 的文件默认被打开了,是什么文件呢?打开文件的本质是进程打开文件,文件没有被打开时,在磁盘中。1:标准输出 显示器。原创 2024-09-17 18:08:52 · 999 阅读 · 2 评论 -
编写myshell
shell的解释器本质就是一段代码,用来解释不同的指令,然后做做出相同的操作,下面我们自己编写一个简易的shell。原创 2024-09-16 19:18:52 · 130 阅读 · 0 评论 -
进程程序替换
可以看到,进程在运行到一半,最后一句的printf没有执行,这是为什么呢?因为程序被替换了exec*系列的函数,可以替换当前的程序,进程的程序替换,本质上还是那一个进程,进程不变,但是进程里的程序变了,要是把代码改成多进程版本,让子进程替换,那么父子共享的代码和数据,都要进行写时拷贝。原创 2024-09-16 19:17:47 · 573 阅读 · 0 评论 -
进程控制管理
进程出异常,本质上是操作系统给进程发出信号,一旦异常退出,退出码就没有意义了,要看操作系统给进程发出的退出信号,退出信号可以表示进程为什么异常退出,比如一个死循环的进程,我们可以用kill -9 进程pid 来向进程发出终止信号,那么进程就会异常退出,退出信号就是9,任何子进程,在退出时都要等待被父进程回收,子进程的代码和数据先释放,task_struct保留退出信息,等父进程回收,在这个过程中子进程处于Z状态,参数:输出型参数,获取子进程退出状态,如果不关心,可以设置成NULL,原创 2024-09-15 15:48:38 · 688 阅读 · 0 评论 -
程序地址空间
在操作系统内部,会有虚拟地址空间,通过页表的映射,访问物理内存空间,由于子进程拷贝的是父进程的数据,所以同一份代码,父子进程是共享的,当子进程要修改g_val的值时,又为了不影响父进程对g_val的使用,就有了写时拷贝,子进程会把父进程的很多数据结构都拷贝一份,包括虚拟地址空间,本质上虚拟地址空间也是一个结构体,当操作系统发现子进程的要更改的数据和父进程指向的数据冲突了,才会进行写时拷贝,在物理内存上开辟g_val的空间,子进程通过页表映射的物理内存地址也就和父进程页表映射的g_val的地址不一样了,原创 2024-09-15 15:47:37 · 889 阅读 · 0 评论 -
进程优先级和环境变量
命令行中启动的程序,都会变成进程,其实都是bash的子进程,父进程的数据,默认对于子进程是能看到并访问的,但是子进程的后续修改,对于父进程是看不到的,系统中的很多配置,在我们登录linux系统的时候,就已经被加载到bash进程中(内存),最开始的环境变量在配置文件中,然后被加载到bash中,nice的调整是有限制的,修改范围位[-20,19],而且每次调整优先级,PRI的值都是从80开始的,避免修改叠加。cpu资源分配的先后顺序,就是指进程的优先级,linux中进程的优先级数字越小,优先级越高;原创 2024-09-14 23:05:59 · 1303 阅读 · 0 评论 -
进程的基本概念
数据要在计算机结构进行传输,从一个设备到另一个设备,本质上是数据的拷贝,设备之间的拷贝效率决定了计算机的整体效率,当我们运算数据时,CPU直接从储存器读取数据,减少了数据从输入设备到CPU的传输时间,如果没有了储存器,直接从输入设备直接把数据传给CPU,那么CPU的运算效率远远大于输入设备的传输效率,这样计算机的整体效率就取决与数据传输的效率,就很慢了,所以这就是冯诺依曼的优秀之处。我们直接在命令行里启动的进程,他的父进程是bash,bash会自动回收结束的进程, 所以不会产生僵尸进程,原创 2024-09-14 23:04:44 · 1014 阅读 · 0 评论 -
git的使用和gdb工具
程序的发布模式有两种,debug和release,我们一般调试代码是用debug模式,由于gcc/g++编译出来的二进制文件默认是release模式,所以我们需要在后面加上-g选项,使其变成debug模式。gdb具有记忆功能,可以自动记忆上一个命令,点击回车可以执行下一个命令。disable/enable 断点编号:可以打开/关闭断点。list/l 行号/文件名:可以打印出代码在屏幕上。display 变量编号:可以把变量长显示在屏幕上。b 文件名/行号:在第几行打印断点。gdb 文件名:打开gdb工具。原创 2024-09-07 22:39:11 · 471 阅读 · 0 评论 -
linux编译器——gcc/g++
g++ -o mytest test.cpp 被执行,当我们再次make时,由于test.cpp是最新版本,所以他不会再执行了,因为有些函数是别人已经写好了,我们用的时候不用再重新写了,直接拿过来用就好了,这个写好的函数家就在库中放着,所以我们要链接库。make是一个命令,makefile是一个文件,make会根据makefile的内容,完成编译和清理工作,gcc --version 可以查看当前的版本 ,我们默认安装的是4.8.5的版本,比较低,-o指明生成文件的名字,可以自己命名,比如:my.exe。原创 2024-09-07 22:38:27 · 1035 阅读 · 0 评论 -
Linux编辑器——vim的使用
原理:vim并不是直接执行,执行前会读取一些文件,比如.vimrc 我们把需要配置的指令写在.vimrc文件中,然后vim执行时就会读取.vimrc文件,配置一些功能,比如行号,自动缩进,自动补齐,代码提示等等;n+shift+x:可以删除光标之前的一个字符,n:一次可以删除n个,在一行以内。n+x :可以删除光标后面的一个字符,n:一次可以删除n个,在一行以内。:控制光标的移动,字符的输入,删除,复制粘贴等等,有一些相关的指令;n+shift+g=nG:将光标定位到整个文本的任意一行,原创 2024-07-18 20:07:29 · 660 阅读 · 0 评论 -
Linux软件包管理器——yum
在linux下安装软件,一个通常的办法就是下载程序的源代码,编译,得到可执行程序,但是这样比较麻烦,就有人把一些常用的软件提前编译好,做成软件包,这样下载的时候,直接下载软件包,就可以使用的,类似于手机上的app;软件包管理器就类似于下载app的应用商店;yum是Linux下非常常用的一种软件包管理器,主要应用在Fedora,RedHat,Centos等发行版上;原创 2024-07-15 22:43:05 · 185 阅读 · 1 评论 -
Linux权限
Linux严格意义上来说是一个操作系统,我们称之为核心(kernel),但是我们用户一般不能直接使用kernel,而是通过kernel的外壳,也就是所谓的shell,来与kernel沟通,那么为什么不直接使用kernel呢?从技术角度,shell的最简单定义:命令行解释器主要包括:把使用者的命令传给kernel;将kernel处理后的结果返回给使用者;原创 2024-06-26 19:00:32 · 715 阅读 · 0 评论 -
Linux相关指令
在linux中,可以用echo向屏幕中输出字符串:这是向屏幕输出,我们也可以向文件中输出:我们写了一段话 "hello linux",写入log.txt文件中;原创 2024-05-19 21:17:48 · 669 阅读 · 0 评论