系统和进程

一、 /proc 文件系统

​ /proc 虚拟文件系统为访问内核信息提供了方便, 该文件系统驻留于/proc 目录中,包含了各种用于展示内核信息的文件,并且允许进程通过常规文件 I/O 系统调用来方便地读取,有时还可以修改这些信息。之所以将/proc 文件

系统称为虚拟,是因为其包含的文件和子目录并未存储于磁盘上,而是由内核在进程访问此类信息时动态创建而成。

​ 对于系统中每个进程,内核都提供了相应的目录,命名为/proc/PID,其中 PID 是进程的ID。在此目录中的各种文件和子目录包含了进程的相关信息。例如,通过查看/proc/1 目录下的文件,可以获取 init 进程的信息,该进程的 ID 总是为 1。

book@100ask:/proc/1$ sudo ls
[sudo] password for book: 
arch_status	 cpuset   loginuid    numa_maps      sched	   status
attr		 cwd	  map_files   oom_adj	     schedstat	   syscall
autogroup	 environ  maps	      oom_score      sessionid	   task
auxv		 exe	  mem	      oom_score_adj  setgroups	   timers
cgroup		 fd	  mountinfo   pagemap	     smaps	   timerslack_ns
clear_refs	 fdinfo   mounts      patch_state    smaps_rollup  uid_map
cmdline		 gid_map  mountstats  personality    stack	   wchan
comm		 io	  net	      projid_map     stat
coredump_filter  limits   ns	      root	     statm

每个/proc/PID 目录中都存在一个命名为 status 的文件,提供了有关该进程的一系列信息。

/proc/pid 目录下常用文件:

cmdline以\0 分隔的命令行参数
cwd指向当前工作目录的符号链接
EnvironNAME=value 键值对环境列表,以\0 分隔
exe指向正在执行文件的符号链接
fd文件目录,包含了指向由进程打开文件的符号链接
maps内存映射
mem进程虚拟内存(在 I/O 操作之前必须调用 lseek()移至有效偏移量)
mounts进程的安装点
root指向根目录的符号链接
status各种信息(比如,进程 ID、凭证、内存使用量、信号)
task为进程中的每个线程均包含一个子目录

访问 proc文件:

​ 通常使用 shell 脚本来访问/proc 目录下的文件(使用诸如 Python 或者 Perl 之类的脚本语言,很容易解析大多数/proc 目录下包含有多个值的文件)。例如,使用如下 shell 命令,就可以修改和查看/proc 目录下的文件内容:

echo 100000 > /proc/sys/kernel/pid_max
cat /proc/sys/kernel/pid_max

​ 也可以从程序中使用常规 I/O 系统调用来访问/proc 目录下的文件。但在访问这些文件时,有如下一些限制。

① /proc 目录下的一些文件是只读的,即这些文件仅用于显示内核信息,但无法对其进行修改。/proc/PID 目录下的大多数文件就属于此类型。

② /proc 目录下的一些文件仅能由文件拥有者(或特权级进程)读取。例如,/proc/PID目录下的所有文件都属于拥有相应进程的用户,而且即使是对文件的属主,其中的部分文件(如:proc/PID/environ 文件)也仅仅授予了读权限。

③ 除了/proc/PID 子目录中的文件,/proc 目录的其他文件大多属于 root 用户,并且也仅有 root 用户能够修改那些可修改的文件。

int fd;
char line[100];
fd= open("/proc/sys/kernel/pid_max",O_RDWR);
read(fd,line,100);
write(fd,"1000",5);

系统标识: uname

uname 系统调用返回了一系列关于主机系统的标识信息,存储于buf所指向的结构中。

#include <sys/utsname.h>
int uname(struct utsname *buf);

struct utsname {
    char sysname[];    /* Operating system name (e.g., "Linux") */
    char nodename[];   /* Name within "some implementation-defined
                                     network" */
    char release[];    /* Operating system release (e.g., "2.6.28") */
    char version[];    /* Operating system version */
    char machine[];    /* Hardware identifier */
    #ifdef _GNU_SOURCE
    char domainname[]; /* NIS or YP domain name */
    #endif
};

备注:参考Linux-UNIX系统编程手册

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值