gdb调试命令
进入gdb调试:gdb 文件名
逐过程:next(n)
逐语句:step(s)
查看变量:print(p) 变量名
查看代码:list(l) 行号
持续监测变量:display 变量名
结束监测:undisplay 变量编号
下断点:break(b) 行号/函数名
run和start区别:他们都是开始调试,start会停在main函数第一行,run会停在第一个断点处。
continue:继续运行到下一个断点
临时禁用断点:disable 断点编号
重新启用断点:enable 断点编号
退出调试模式:quit(q)
写出完成一下功能的常用shell 命令
查看/etc/bin 文件夹下的所有文件(包括子文件夹以及所有隐藏文件的详细信息)
ls -aRl /etc/bin
切换到根目录下
cd /
在当前路径下创建一个 aa/bb/cc 关系的文件夹
mkdir aa/bb/cc -p
删除上面创建的文件夹
rm -rf aa
mv命令的作用
两个参数,第一个参数指定对那个文件操作,第二个参数,如果不存在就是对第一个参数重命名,存在就是移动覆盖。
输出字符串”hello world”到 a.txt(文件已存在当前路径下) 文件中
echo "hello world" > a.txt
查看磁盘使用情况
df -h
当前在~路径下,修改/usr路径下 aa 文件的权限为r-x rw- r--
chmod 0564 /usr/aa
把/etc/bin文件夹下的a文件所有者和所属组从原来的root:root改为colin:colin
sudo chown colin:colin /etc/bin/a
查找/etc文件夹(包括子文件夹)下的所有以a开头的文件
find /etc -name "a*"
查询当前路径(包括子文件夹)下文件中有以“ret”开头的字符串的文件,并显示文件中的行号
grep "ret" -Rn
写出挂起进程cat后,使用信号杀死这个进程的一组命令
jobs 查看作业号
kill -9 %作业号
给aa文件创建一个符号连接文件xx和硬链接文件yy的命令分别是什么?符号连接和硬链接有什么区别?从原理、inode 编号、链接计数器、删除源文件后的现象等几个方面进行描述。
ln -s aa xx,ln aa yy,硬链接的inode和原文件的inode相同链接计数器会+1删除源文件后新的不会失效链接计数器会-1,符号连接是再定义一个inode指向原文件的inode,链接计数器不会增加,删除源文件,符号链接会失效。
Makefile 的优势是什么?makefile 是怎么节省编译时间的?编译器是怎么判断哪个源文件被修改的?
一次编写,终身受益,重用性极强,不用再写复杂的编译命令,节省编译时间,第一次编译的时候不会节省编译时间,会把.c文件编译成.o文件保存,下次编译只会编译修改过的.c文件,根据.c文件和.o文件的创建时候来判断是否修改。
发送函数阻塞和非阻塞有什么区别?分别写出在 linux和 windows下设置套接字阻塞和非阻塞的函数。
在Linux下:
#include <fcntl.h>
int flags = fcntl(sockfd, F_GETFL);
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
在Windows下:
#include <winsock2.h>
#include <windows.h>
u_long mode = 1; // 1 for non-blocking mode, 0 for blocking mode
ioctlsocket(sockfd, FIONBIO, &mode);
Linux文件IO函数有哪几个?哪些函数在什么场景下是阻塞函数?
- open:打开或创建文件。
- close:关闭文件描述符。
- read:从文件描述符中读取数据。
- write:向文件描述符中写入数据。
- lseek:在文件中移动读写指针。
- fcntl:对文件描述符进行各种控制操作。
- ioctl:设备控制命令。
- read:从文件描述符中读取数据时,如果没有数据可读,会阻塞直到有数据到来或者遇到EOF。比如:读从终端输入的数据没有换行符,read读终端设备就会阻塞,网络没有数据包,read从网络读就会阻塞。
- write:向文件描述符中写入数据时,如果输出缓冲区已满,会阻塞直到数据被写入到缓冲区中。
- open:打开文件时会阻塞,直到文件成功打开或者失败。
描述 Linux 文件系统存储文件的过程。
1.来Boot Block查看磁盘分了几个区到自己具体的Block Group里面
2.到GDT块组描述符表,查看其他的几个功能块的位置,看是否有空闲的inode,没有就去下一个Block Group。
3.到inode bitmap里找一个空闲的inode节点,把文件属性写入找到的那个inode节点,到inode bitmap把此inode的标志位置为1。
4.到block bitmap块位图找到一个空闲的块,把内容存进块中,存完后把块的地址存到inode的数据块指针里,在block bitmap把对应块的标志位置为1。
描述 Linux文件系统读取文件的过程。Inode节点编号保存在什么地方?使用哪几个函数可以读取 inode 编号?
Linux文件系统读取文件的过程:
1.来Boot Block查看磁盘分了几个区到自己具体的Block Group里面。
2.到GDT块组描述符表,查看inode table的起始位置。
3.根据节点编号找到当前文件的inode节点,根据inode节点保存的数据块指针找到存储数据的数据块位置进行读取。
inode节点编号保存在文件夹记录项,stat,fstat,lstat可以查看inode编号。
一个inode 节点中有数据块指针 60字节,一个地址是4字节,可以存 15 个地址指针,是怎么存储大文件的?
多级寻址,15个指针,前12个存文件内容也就是(48kb),第13个指向一个datablock(4kb)但里面存的是地址(能存1024个指针每个指向一个datablock(4kb)存文件内容,一级寻址一共能存4M),如果文件大小超过了4M+48k,就启用第14个指针二级寻址指向一个块里面装地址指针,每个指针指向的块又装的地址指针,装的指针指向的块装的才是数据,二级寻址可以装1024*1024*4k=4g大小的数据,超过4g就启用最后一个指针三级寻址能容纳1024*1024*1024*4k=4t大小的数据。
从 Linux 文件系统的原理分析,为什么永久删除的文件还能够复原?
删除文件的流程
1.来Boot Block查看磁盘分了几个区到自己具体的Block Group里面。
2.到GDT块组描述符表,查看inode bitmap的起始位置和block bitmap的起始位置。
3.将inode bitmap的对应位置置为0,block bitmap的对应位置置为0。
删除只是将文件对应的inode bitmap和block bitmap的位置置为0,并没有真正的删除数据。