该系列文章总纲链接:专题分纲目录 LinuxC 系统编程
本章节思维导图如下所示(思维导图会持续迭代):
第一层:
第二层:
1 符号链接操作
符号链接:也叫软链接,类似于快捷方式。当对软链接进行操作时,就是对软链接所对应的文件本身进行操作。
符号链接的功能:
- 方便用户查找文件,不需要路径等繁琐的过程。
- 增加了系统的安全性,从某种意义上屏蔽了路径的信息。(可以对文件进行操作,但是文件的位置实际上是被屏蔽的)
1.1 创建一个符号链接
linux环境下使用symlink函数创建一个符号链接。symlink函数的原型:
#include <unistd.h>
int symlink(const char *oldpath, const char *newpath);
参数oldpath :文件的路径
参数newpath :创建的符号链接的名字
函数执行成功返回0,失败返回-1。
注意:
- 新创建的符号链接的权限全部被设定。所以要控制symlink函数创建的符号链接的权限时,必须使用权限屏蔽字。
- 对于不存在的文件,一样可以创建软链接,只有当打开这个链接的时候才会因为目的文件不存在而导致文件打开出错。
1.2 读写符号链接的目的文件
用户可以像操作文件一样操作符号链接所指向的文件。当用户用系统调用open、read、write、close等函数对软链接进行操作的时候,就相当于对目标文件本身进行操作。对于软链接的软链接,操作的结果也是一样。因为这些系统调用会一直跟踪符号链接,直到遇到目的文件为止。
1.3 读写符号链接
符号链接是文件中的一种,这种文件也有自己保存的内容,保存的是目的文件的路径,其实是一个字符串。Linux下用readlink函数来实现读取符号链接本身的内容。readlink函数的原型:
#include <unistd.h>
ssize_t readlink(const char *path, char *buf, size_t bufsiz);
参数path :链接的名字
参数buf :存储符号链接内容的缓冲区(读取链接的名字后将字符串存储的位置)(属于值结果参数)
参数bufsiz :最大读取的字节数
函数执行成功返回实际读到的字节数,失败返回-1。
对于一个不存在的文件的软链接,readlink也可以读取符号链接的内容。因为readlink函数在符号链接的数据块上读取内容,该内容是一个路径名,只是该路径的端点上的文件不存在而已。
1.4 取得符号链接的状态
取得一般文件的状态以及取得符号链接所指向的文件的状态都可以用stat函数进行文件信息的读取。对于软链接本身的状态需要lstat函数来读取(lstat函数在前面有说明),lstat函数不跟踪链接,因此可以取得软链接本身的文件状态信息。
1.5 更改符号链接的所有者
chown可以改变文件所有者ID,也可以改变链接所指向的文件的所有者ID,但那是chown不能改变软链接本身的ID。lchown函数可以直接更改软链接本身的ID,也只用于更改软链接本身的ID。
2 proc文件系统
- /proc目录下的文件受系统中运行进程的影响,因此这些文件只存储在内存之中。
- /proc文件系统的设计意图在于为用户提供一组访问进程内核数据的接口。
- /proc是一个伪文件系统,今存在于内存当中
2.1 proc文件系统简介
proc文件系统既是一个到运行中进程地址空间的访问接口,也是访问内核数据的接口。用户和应用程序可以通过proc得到系统的信息和运行中的进程信息,并且可以改变内核中的某些参数,从而可以通过proc来配置系统。普通的程序可以通过linux系统调用访问proc文件中的内容,以取得相应的信息。
2.2 常用的内核信息和进程状态信息
proc目录下面有两大类子目录:
一部分目录均以数字命名:每个数字都是以系统进程的PID命名,这些目录下包含运行中进程的信息。其中,proc/self表示当前运行进程的proc抽象,是指当前执行进程的符号链接。每个进程目录下都会包含一些文件,这些文件包含了运行进程中的所有信息。其中status文件包含了当前进程的状态信息,其所在目录为/proc/self/task进程ID。
进程目录下文件的含义:
cmdline :命令行参数
environ :环境变量值
fd :包含所有文件描述符的目录
mem :进程内存利用情况
stat :进程状态信息
status :进程当前状态,以可读的方式显示出来
cwd :当前工作目录的链接
exe :指向该进程的执行命令文件
maps :内存映像
statm :进程内存状态信息
root :链接此进程的root目录
不包含任何数字的目录:内部是一些内核的数据信息。具体的含义见表:
apm :高级电源管理信息
bus :总线相关信息
cmdline :内核引导命令行参数
cpuinfo :cpu相关信息
devices :当前可用设备
dma :DMA通道使用情况
filesystems :当前内核支持的文件系统
driver :驱动相关信息
execdomains :安全相关信息
fs :本地文件系统参数
ide :IDE子系统相关信息的子目录
interrupts :中断使用状况
iomem :内存映射图
ioports :I/O端口好似用状况
irq :关联cpu的irq使用情况
kcore :内核转储映像
kmsg :内核消息
ksyms :内核符号表
loadavg :系统平均负载
locks :内核锁
meminfo :内存信息
misc :内核信息杂项
modules :已经加载的内核模块列表
mounts :已经加载的文件系统
net :网络子系统信息
partitions :已经识别的系统分区表
pci :pci总线相关信息
rtc :实时时钟
scsi :scsi总线信息
slabinfo :slab池信息
stat :内核状态总览
swaps :页面交换空间的利用情况
sys :内核系统参数
tty :tty驱动
uptime :系统
version :内核版本
可以通过系统调用来查看有关进程和内核的信息,并可以更改内核的信息。