1.linux目录的作用: Linux操作系统下各路径存放什么文件?(usr/dev/opt/etc/home/bin/media)
1./usr:Unix System Resource,系统资源目录。 /usr 下放的是用户级软件资源,通常体积更大、内容更全。常见的子目录还有 /usr/local(用户自行编译安装的软件,优先级高于系统自带版本)、/usr/share(架构无关的共享数据,如文档、图标、man 手册)。
2./.dev:device,设备文件目录。Linux 一切皆文件,硬件设备抽象成文件。设备文件分两类:字符设备(按字节流读写,如串口、键盘)和块设备(按数据块读写,如硬盘、U 盘)。
3./opt:可选第三方大型软件安装目录。独立商业 / 第三方应用,软件整套文件都放在它自己的子目录下,例如有些 QT、大型工控软件。它的特点是"一个软件一个目录",卸载时直接删掉对应目录即可,不会污染系统其他路径,因此很多商业软件、交叉编译工具链都习惯装在这里。
4./etc:etcetera,系统配置文件目录。几乎所有系统、服务的配置文件在这里:/etc/passwd用户信息、/etc/profile环境变量、/etc/sshssh 配置。不含可执行程序。修改这里的文件往往直接影响系统行为,所以操作前建议先备份;/etc 下的配置大多是纯文本,便于用编辑器直接查看和修改。
5./home:普通用户家目录。每个普通用户一个子文件夹,比如 /home/hqyj,存放该用户自己的文档、代码、配置。root 用户家目录是 /root,不在 home 下。用户登录后默认进入自己的家目录,个人数据、开发工程、shell 配置文件(如 .bashrc)都放在这里,普通用户对自己家目录拥有完整读写权限。
6./bin:binary,基础可执行二进制命令。系统启动、单用户模式下必须用到的基础命令,ls、cp、cat等,所有用户都可以使用。在不少发行版中 /bin 已经是指向 /usr/bin 的软链接,二者在功能上逐渐合并,但理解其"基础命令"的定位仍然很重要。
7./media:挂载可移动介质。U 盘、SD 卡、移动硬盘自动挂载点,插上外设自动在这里生成目录。与之类似的还有 /mnt,通常用于手动挂载临时文件系统;/media 更偏向桌面环境自动挂载可移动设备,插入 U 盘后一般会在 /media/用户名/ 下出现对应目录。
2、Linux操作指令:
查看文件前5行
head -n 5 文件名
head默认输出前 10 行,-n 5表示只取前 5 行。常用于快速确认文件开头格式,比如查看日志、CSV 表头、配置文件头部。若想跳过前几行再显示,可用head -n +5 文件名(从第 5 行开始显示)。
查看文件后5行 且实时查看
tail -n 5 -f 文件名
tail默认输出末尾 10 行,-n 5取最后 5 行;-f(follow)表示持续跟踪文件新增内容,文件被追加写入时会实时刷新输出,是排查运行日志最常用的组合。按Ctrl + C退出跟踪。若日志被轮转(如 logrotate),可用tail -F 文件名,它在文件被替换后会自动重新打开。
搜索文件是否包含特定内容
grep “要查找的字符串” 文件名 grep -r “要查找的字符串” 目录
grep在文件中按行匹配字符串,默认区分大小写,加-i忽略大小写;-n显示行号,-v反向匹配(输出不含该字符串的行)。-r表示递归搜索整个目录及其子目录,常配合--include="*.c"限定只搜某类文件,例如grep -rn "main" ./src --include="*.c",在源码工程里定位函数或变量非常高效。
压缩与解压文件
压缩:tar -zcvf test.tar.gz 文件/文件夹
解压:tar -zxvf test.tar.gz
参数含义:z使用 gzip 压缩,c创建归档,x解压归档,v显示处理过程,f指定归档文件名(必须紧跟文件名)。解压到指定目录可加-C 目标目录,例如tar -zxvf test.tar.gz -C /opt/app。若只需查看压缩包内容而不解压,用tar -ztvf test.tar.gz。除 tar.gz 外,.tar.bz2用j参数,.tar.xz用J参数。
创建软连接与硬链接
硬链接:ln 源文件 链接名
本质:和源文件共用同一个 inode。inode 记录文件在磁盘上的数据块位置;多个硬链接指向同一份磁盘数据。简单理解:同一个文件,多个名字。
软连接:ln -s 源文件/源路径 链接名
本质:是一个独立的小文件,里面存的是【源文件的路径字符串】,有自己独立 inode。类似 Windows 的快捷方式。
软链接可以跨分区、可以链接目录;硬链接不能跨分区、不能链接目录
如何修改某网卡的ip地址
临时修改 ifconfig eth0 192.168.1.100 netmask 255.255.255.0
3.软链接与硬链接的区别
硬链接:多个文件名指向同一磁盘数据;
软链接:保存路径的独立快捷方式文件。
4、环境变量有什么用?什么时候需要使用到环境变量?如何配置环境变量?
1.作用
环境变量是Shell / 进程运行环境里保存的全局字符串参数,用来给程序传递配置信息,不需要改代码就能调整程序行为;每个进程都有自己独立的环境变量表,子进程默认继承父进程的环境变量。
2.什么时候用
指定程序搜索路径:最典型 PATH,系统在 PATH 目录里查找可执行命令;
传递配置参数:数据库地址、日志路径、调试开关、端口号;
设置程序运行特性:编码 LANG、终端属性、编译器相关环境变量;
区分运行环境:开发环境、测试环境、生产环境切换配置;
给子进程传递参数,不用通过命令行 argc/argv 传参。
5.现有文件main.c 1.c 1.h 2.c 2.h 五个文件,编写一个Makefile将五个文件编译成main.exe 要求使用符号优化写法,并增加clean指令
CC = gcc TARGET = main.exe OBJS = main.o 1.o 2.o $(TARGET): $(OBJS)$(CC)$^-o $@# 模式规则,自动把.c编译成.o%.o:%.c $(CC)-c $<-o $@.PHONY: clean clean:rm-f $(TARGET)$(OBJS)逐行解释:
CC = gcc:定义编译器变量TARGET = main.exe:目标程序名SRCS = main.c 1.c 2.c:所有源文件,头文件.h 不需要写在依赖里(gcc 会自动处理)$^:自动变量,代表所有依赖文件(main.c 1.c 2.c)$@:自动变量,代表当前目标(main.exe).PHONY: clean:声明 clean 是伪目标,防止目录里有名为 clean 的文件干扰clean:删除生成的可执行文件$<:代表第一个依赖文件
好处:修改其中一个 c 文件,只会重新编译这一个,不会全部重编译
6、GDB调试一般用于排查什么问题?GDB的调试流程?
- 段错误:访问非法内存(空指针、越界、野指针)
- 程序崩溃、异常退出:定位崩溃在哪一行、哪个函数。
- 逻辑错误:程序能跑,但是结果不对;断点查看变量、内存、函数返回值。
- 死循环、死锁:卡住不动,用
bt看调用栈,看卡在哪个位置。 - 查看函数调用流程、查看变量值、分析内存。
GDB 调试流程:
1.编译程序时加-g参数,生成调试符号信息
gcc main.c-g-omain.exe2.启动 GDB,加载可执行文件
gdb ./main.exe3.设置断点(break),在想要停下的位置(函数名 / 行号)
b main4.运行程序 run(r),程序会执行到断点处停下
- 单步调试 / 查看信息
nnext:单步跳过(不进函数)sstep:单步进入(跳进函数)p 变量:打印变量值bt:查看调用栈(崩溃时重点)l:查看源码c:continue 继续运行到下一个断点
7、段错误是什么意思?产生段错误的原因有哪些?
段错误简单理解就是:非法内存访问
常见的五种情况:
1.空指针解引用
int *p = NULL;
*p = 10;
2.野指针
int *p;
*p = 10;
3.数组越界访问
int arr[5];
arr[10] = 1;
4.修改只读内存
char *s = “hello”;
s[0] = ‘H’; // 字符串常量存放在只读段,不能写
5.访问已经释放的内存
int *p = malloc(4);
free§;
*p = 10;
8、标准IO与文件IO的区别有哪些?
标准 IO 是 C 库封装的 IO,文件 IO 是操作系统内核提供的系统调用
- 所属层次不同
文件 IO:内核系统调用,没有 C 库缓冲;
标准 IO:C 标准库函数,自带用户态缓冲区。
- 缓冲机制
文件 IO:无用户缓冲区,调用 read/write 直接陷入内核;
标准 IO:自带行缓冲、全缓冲、无缓冲,减少频繁系统调用,效率更高。
- 操作对象
文件 IO:操作文件描述符 fd(int 类型数字);
标准 IO:操作FILE* 文件流指针。
- 跨平台性
文件 IO:Linux 系统特有,不可移植;
标准 IO:C 语言标准,跨平台(Windows、Linux 都能用)。
- 调用开销
文件 IO:每次读写都进内核,频繁小量读写开销大;
标准 IO:先写到用户缓冲区,攒够一次再调用系统调用,减少陷入内核次数。
- 函数接口
文件 IO:open read write close lseek
标准 IO:fopen fread fwrite fclose fgets fprintf fscanf
9.标准IO的缓冲区有哪些?作用于哪里?刷新条件有哪些?为什么需要用到缓冲区?
标准 IO 的缓冲区在用户空间(应用层),不是内核缓冲区
1. 全缓冲
作用对象:普通磁盘文件(fopen 打开的常规文件)
刷新条件:
缓冲区写满
主动调用fflush()刷新
文件关闭fclose()
程序正常退出
2. 行缓冲
作用对象:终端设备(stdout标准输出,屏幕)
刷新条件:
遇到换行符\n
缓冲区写满fflush()主动刷新fclose()/ 程序正常结束
当要从这个流读入数据时,自动刷新
3. 无缓冲
作用对象:stderr标准错误
刷新条件:数据一写入就立刻输出,没有缓冲,直接下发内核**
重点区分:stdin、stdout默认是行缓冲;stderr默认无缓冲;
fopen 打开的普通文件默认全缓冲。
系统调用(read/write,文件 IO)是要从用户态切换到内核态,切换开销很大。
缓冲区的目的:合并多次小块 IO,减少系统调用的次数,降低用户态到内核态切换开销,提升 IO 效率。
简单说:攒一批数据,一次性交给内核,而来一笔就跑一次内核。
10.动态库和静态库的区别?各有什么好处?
静态库:.a,编译链接阶段, 把库里面的代码复制打包进可执行程序
好处:运行不依赖库文件,独立可执行,加载快;
缺点:程序体积大,库更新要重新编译。
动态库:.so,链接阶段只记录依赖信息,运行的时候才加载到内存
好处:库可以共享,节约内存,程序体积小,单独升级库;
缺点:运行环境必须有对应的动态库。
11.使用文件IO实现cp功能
#include<stdio.h>#include<unistd.h>#include<fcntl.h>#include<sys/stat.h>#defineBUF_SIZE1024// 缓冲区大小intmain(intargc,char*argv[]){// argc 参数个数,argv[1]源文件,argv[2]目标文件if(argc!=3){printf("用法:%s 源文件 目标文件\n",argv[0]);return-1;}// 打开源文件:只读 O_RDONLYintfd_src=open(argv[1],O_RDONLY);if(fd_src<0){perror("open src failed");return-1;}// 创建目标文件:只写 | 不存在则创建 | 截断清空原有内容,权限0644intfd_dst=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0644);if(fd_dst<0){perror("open dst failed");close(fd_src);return-1;}charbuf[BUF_SIZE];ssize_tret;// read返回读到的字节数// 循环读取while((ret=read(fd_src,buf,BUF_SIZE))>0){// 把读到的ret个字节写入目标文件write(fd_dst,buf,ret);}if(ret<0){perror("read error");}// 关闭文件描述符close(fd_src);close(fd_dst);return0;}gcc cp.c-ocpfile ./cpfile test.txt bak.txt