pkg-config
pc文件的两个路径:
- /usr/lib下的所有*.pc文件。
- PKG_CONFIG_PATH环境变量所指向的路径下的所有*.pc文件。
两个常用的指令
- --cflags 包含了编译选项
- --libs 包含了常用的lib目录
# 示例
prefix=/usr/local
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${exec_prefix}/lib
Name: foo Description: The foo library
Version: 1.0.0
Cflags: -I${includedir}/foo
Libs: -L${libdir} -lfoo
常见文件夹作用
- /media 光盘 软盘 由系统挂载
- /mnt 由用户手动挂载
与命令行有关
- /sbin 超级用户指令, cfdisk、dhcpcd、dump
- /bin 基本指令,例如: cat、 ls、 cp。
- /lib 依赖库,包含了bin所需要的依赖,为内核级./usr/lib是系统级的,/usr/local/lib是用户级的.
-
/usr 应用程序以及相应库文件(包括用户以及系统)
which is similar with
C:/Windows/System32/usr/include linux下开发和编译应用程序所需要的头文件 /usr/source 系统级源码 /usr/lib 常用的动态链接库和软件包的配置文件 /usr/bin 众多的应用程序which is similar with
C:/Progrem Files//usr/local/include linux下开发和编译应用程序所需要的头文件 /usr/local/src:用户级的源码目录 /usr/local/bin 本地增加的命令 /usr/local/lib 本地增加的库/usr/sbin 超级用户的一些管理程序 /usr/man 帮助文档 /usr/doc linux文档 /usr/src 源代码,linux内核的源代码就放在/usr/src/linux里
-
/opt 第三方软件
- /etc 配置文件
- /dev 设备信息
- /proc 内存映射
- /lost+found 系统恢复文件
- /var 包括了一些数据文件,如系统日志,锁等
常见命令
-
查找文件中的某个字符串
grep -rn function ///参数 + 字符名 + 路径 -
查找某个文件
find / -name httpd.conf//路径 + 参数 + 文件名 -
删除命令行内容
ctrl + u光标之前的内容ctrl + k光标之后的内容 -
内存
free -
硬盘
df -
内核
uname -
进程
psortop -
程序运行时间
time ***
gdb常见命令
file 装入想要调试的可执行文件.
kill k 终止正在调试的程序.
list l 列出产生执行文件的源代码的一部分.
next n 执行一行源代码但不进入函数内部.
step s 执行一行源代码而且进入函数内部.
continue c 继续执行程序,直至下一中断或者程序结束。
run r 执行当前被调试的程序.
quit q 终止 gdb.
watch 使你能监视一个变量的值而不管它何时被改变.
catch 设置捕捉点.
thread t 查看当前运行程序的线程信息.
break b 在代码里设置断点, 这将使程序执行到这里时被挂起.
make 使你能不退出 gdb 就可以重新产生可执行文件.
shell 使你能不离开 gdb 就执行 UNIX shell 命令.
print p 打印数据内容。
examine x 打印内存内容。
backtrace bt 查看函数调用栈的所有信息。
内存映射 mmap
本质上通过建立映射,来避免拷贝。这里以一次完整的文件读的流程为例。
-
文件的读 传统方法:磁盘->内核空间->用户空间 //两次拷贝 内存映射:磁盘--内核空间->用户空间 //一次拷贝
--代表了映射关系,映射不需要拷贝,一定程度上可以理解成指针访问。 当用户请求访问时,才会真正读取数据。 -
进程间通信 传统方法:用户空间1->内核空间->用户空间2 //两次拷贝,namedpipe 内存映射:用户空间1->内核空间--用户空间2 //一次拷贝, shared memory
用户空间各进程之间独立,内核空间各进程之间共享。
G++/GCC
rc VS profile (bash)
当用户通过ssh等登录的方式打开shell时,会执行bash_profile (ubuntu 中为profile)
当用户通过界面方式打开shell时,会执行bashrc。
- 只有交互模式才会执行此代码,非交互模式不执行,如
bash xxx.sh- 有全局与用户之分,首先
/etc/bash.bashrcthen~/.bashrc.- 一般bash_profile 内部会调用bashrc
/etc/environment:是系统启动时读取的第一个文件,该文件设置的是整个系统的环境,只要启动系统就会读取该文件,与用户登录无关。系统使用此文件时并不是执行此文件中的命令,而是根据而是根据KEY=VALUE模式的代码,对KEY赋值以VALUE. <blog.csdn.net/u010533843/… >- 切换用户不会继承env, 如果想要保留执行
sudo -E xx
PATH env
-
linux
PATH可执行文件LD_LIBRARY_PATH动态链接库文件(so) -
windows
PATH可执行文件(exe) 与 动态链接库文件(dll)
压缩与解压文件
tar -czvf test.tar.gz a.c //压缩 a.c文件为test.tar.gz
tar -xzvf test.tar.gz //解压
c:创建打包文件 x:还原打包文件
z:使用zip压缩 v:显示详细信息 f: 指定文件
文件权限命令
usermod用于修改用户的UID、GID与groups,具体用法:
usermod -u 9999 testuser // 将testuser的UID修改为9999
usermod -g 9999 testuser // 将testuser的GID修改为9999
usermod -G 9999 testuser // 将testuser的附加组修改为9999
chown 和 chmod 前者用于修改文件与用户的绑定关系,后者用于设置绑定关系的具体权限。
chown -R root:root /tmp/tmp1 // -R参数同时
chmod [-Rf] u+w 文件名 // 用户所有者增加写权限
chmod [-Rf] 777 文件名 // 给文件赋予777权限
环境变量
- windows中在 bat文件中set命令后需要加"", 例如
set "PATH=%PATH%;c:/Users/xx" - windows 中如果运行时加载dll失败,可能时因为加载此dll所依赖的dll失败,需要将其添加到
PATH目录下 - visual studio 中environment设置两次"path",第二次会覆盖掉第一次的,一般可以取消继承父目录
用户切换
sudo su切换到rootsu username切换到普通用户
软件安装
| Ubuntu | Cenos | |
|---|---|---|
| 安装包格式 | .deb | .rpm |
| 离线安装软件 | dpkg | rpm |
| 在线安装软件 | apt | yum |
以Ubuntu为例
- dpkg与apt的区别
两者都会检查依赖关系,但是dpkg不会自动安装。
apt install内部执行流程,
- 扫描list中对应包的下载地址
- 检查依赖关系
- 下载deb包以及安装。
- dpkg与make install的区别 dpkg 提供了更好的包管理 askubuntu.com/questions/3…
- 安装包之间的互相转换
alienaskubuntu.com/questions/3…
动态链接库在不同系统下对比
| windows | linux | |
|---|---|---|
| 动态链接库后缀 | .dll | .so |
| 动态链接库env | PATH | LD_LIBRARY_PATH |
| 动态链接库folder | bin | lib |
| 可执行文件后缀 | .exe | .out |
| 可执行文件env | PATH | PATH |
| 可执行文件folder | bin | bin |
编译期间的区别:linux直接链接动态库文件(so),与linux不同,windows 在编译时需要动态链接库文件(dll),而是lib文件。
MBR
MBR占据物理磁盘的第一个扇区(512bytes),其中只有64bytes用来存放分区表,最多四个分区表(每个16bytes).
- 最多访问2^32*512bytes,大约为2T的空间。
- 主分区就是真实的分区
- 扩展分区就是存放了逻辑分区的地址(最多只能有一个)
- 逻辑分区类似附加的分区。
现在已经几乎不用了。
参考鸟哥图2.2.6 blog.csdn.net/bruce135lee… blog.csdn.net/White_Idiot…
- GPT分区没有了逻辑分区,扩展分区等概念,所有的分区都是主分区。
开机流程
- BIOS,识别第一个可用的设备
- MBR,446bytes的程序
- Boot loader,其他分区的loader
- 内核文件,真正的系统
- loader只会认识自己分区内的系统或者其他分区的loader。
- 每一个分区都有自己的boot sector
- Windows安装会覆盖自己分区的loader,以及MBR,所有安装双系统的时候,建议优先安装windows.
linux 系统启动流程
- 加载内核文件
/boot 目录下 - 运行第一个程序 /sbin/init,作用是
初始化系统环境由于init是第一个运行的程序,它的进程编号(pid)就是1。其他所有进程都从它衍生,都是它的子进程 许多程序需要开机启动。它们在Windows叫做"服务"(service),在Linux就叫做"守护进程"(daemon)。
- 确定运行级别
- Linux允许为不同的场合,分配不同的开机启动程序,这就叫做"运行级别"(runlevel)。也就是说,启动时根据"运行级别",确定要运行哪些程序。
- 运行级别的默认配置文件存放在
/etc/inittab
- 加载开机启动程序
- 不同级别需要运行的脚本文件放在
/etc/rcN.d目录
- 不同级别需要运行的脚本文件放在
- 用户登陆
- 执行bashrc(本地)或者bash_profile(远程)
- Linux 核心会以自己的功能重新侦测一次硬件, 而不一定会使用 BIOS 侦测到的硬件信息喔! 也就是说, 核心此时才开始接管 BIOS 后的工作了。 那么核心文件在哪里啊? 一般来说, 他会被放置到 /boot 里面, 并且取名为 /boot/vmlinuz
- 虚拟文件系统 ( Initial RAM Disk 或 Initial RAM Filesystem) 一般使用的文件名为 /boot/initrd 或 /boot/initramfs , 这个文件的特色是, 他也能够通过 boot loader 来载入到内存中, 然后这个文件会被解压缩 并且在内存当中仿真成一个根目录, 且此仿真在内存当中的文件系统能够提供一支可执行的程序, 通过该程序来 载入开机过程中所最需要的核心模块, 通常这些模块就是 USB, RAID, LVM, SCSI 等文件系统与磁盘接口的驱动 程序啦! 等载入完成后, 会帮助核心重新调用 systemd 来开始后续的正常开机流程
linux 内核文件
-
核心文件位置: /boot/vmlinuz 或 /boot/vmlinuz-version
-
核心模块文件位置: /lib/modules/version/kernel 或 /lib/modules/$(uname -r)/kernel
- arch : 与硬件平台有关的项目, 例如 CPU 的等级等等;
- crypto : 核心所支持的加密的技术, 例如 md5 或者是 des 等等;
- drivers : 一些硬件的驱动程序, 例如显卡、 网卡、 PCI 相关硬件等等;
- fs : 核心所支持的 filesystems , 例如 vfat, reiserfs, nfs 等等;
- lib : 一些函数库;
- net : 与网络有关的各项协定数据, 还有防火墙模块 (net/ipv4/netfilter/*) 等等;
- sound : 与音效有关的各项模块;
常见命令
modinfo查看模块信息lsmod检查核心载入了多少的模块depmod创建/lib/modules/$(uname -r)/modules.dep, 里面包含了模块之间的依赖关系modprobe载入模块并且检查依赖并且安装 (modprobe 会主动的去搜寻 modules.dep 的内容)insmod完全由使用者自行载入一个完整文件名的模块, 并不会主动的分析模块相依性啊!
计算机基础
-
南桥负责速度较慢的接口,例如硬盘,USB,网卡,IO
-
北桥负责速度较快的接口,例如内存,显卡
-
CPU 主频=外频*倍频 (能够让不同速度之间的设备正常通信)
-
内存双通道的原理是增加总线的宽度。
扇区->磁道->柱面
-
扇区:512bytes
-
磁道:扇区组成的一个同心圆
-
柱面:所有盘片的同一个磁道,也是分割硬盘的最小单位
-
正常的实体机器大概使用的都是 /dev/sd[a-] 的磁盘文件名,至于虚拟机环境底下,为了加速,可能就会使用 /dev/vd[a-p] 这种装置文件名。
扇区是硬盘上存储的最小物理单位 N个扇区可以组成簇,N取决于不同的文件系统或是文件系统的配置,簇是此文件系统中的最小存储单位 所有盘面上的同一磁道构成一个圆柱,称为柱面,柱面是系统分区的最小单位