linux系统和进程信息(/proc)

为了更方便的访问内核信息,许多现代的unix实现提供了/proc虚拟文件系统。其包含的文件和子目录并未存储在磁盘上,而是由内核进程访问此类信息动态的创建而成,都存储在内存里。

对于每个进程,内核都提供了相应的目录,命名为/proc/PID,其中PID是进程号。

下面是/proc/31595/status的相关信息

cat /proc/31595/status 

Name:	redis-server
Umask:	0022
State:	S (sleeping)
Tgid:	31595
Ngid:	0
Pid:	31595
PPid:	1
TracerPid:	0
Uid:	996	996	996	996
Gid:	994	994	994	994
FDSize:	64
Groups:	994 
VmPeak:	  142920 kB
VmSize:	  142912 kB
VmLck:	       0 kB
VmPin:	       0 kB
VmHWM:	    2668 kB
VmRSS:	    1760 kB
RssAnon:	    1036 kB
RssFile:	     724 kB
RssShmem:	       0 kB
VmData:	   24740 kB
VmStk:	     132 kB
VmExe:	     912 kB
VmLib:	    3216 kB
VmPTE:	      72 kB
VmSwap:	       0 kB
Threads:	3
SigQ:	0/3895
SigPnd:	0000000000000000
ShdPnd:	0000000000000000
SigBlk:	0000000000000000
SigIgn:	0000000000001001
SigCgt:	00000001800044ca
CapInh:	0000000000000000
CapPrm:	0000000000000000
CapEff:	0000000000000000
CapBnd:	0000001fffffffff
CapAmb:	0000000000000000
Seccomp:	0
Cpus_allowed:	1
Cpus_allowed_list:	0
Mems_allowed:	00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list:	0
voluntary_ctxt_switches:	35317740
nonvoluntary_ctxt_switches:	1709

下面列举了部分其他文件

文件 描述 
 cmdline 以\0分割的命令行参数
 cwd 指向当前工作目录的符号链接
 Environ name=value键值对的环境列表,以\0分隔
 exe 指向正在执行文件的符号链接
 fd 文件目录,包含了指向由进程打开的文件的符号链接
 maps 内存映射
 mem 进程虚拟内存
 mounts 进程的挂载点
 root 指向跟目录的符号链接
 status 各种信息(比如,进程id、凭证、内存使用量、信号)
 task 为进程中每个线程均包含一个子目录

/proc/PID/fd目录为进程打开的每个文件描述符包含了一个符号链接,每个符号链接的名称都与描述符的数值相匹配。任何进程都可使用符号链接/proc/self来访问自己的/proc/PID目录。


/proc目录下的系统信息

/proc目录下的各种文件和子目录提供了对系统级信息的访问。如下图展示了其中一部分,该图中许多文件在其他文章进行描述。

 目录目录中文件表达的信息 
 /proc 各种系统信息
 /proc/net 有关网络和套接字的状态信息
 /proc/sys/fs 文件系统相关设置
 /proc/sys/kernel 常规内核设置
 /proc/sys/net 网络和套接字设置
 /proc/sys/vm 内存管理设置
 /proc/sysvipc 有关system V IPC对象信息

1./proc目录下大多数文件是只读的,用来显示内核信息。
2./proc目录下的一些文件仅能由文件拥有者或特权级进程读取。
3.除了/proc/PID子目录中的文件,其他文件大多属于root用户,并且仅有root才能更改它。


系统标识:uname()

uname()系统调用返回了一系列关于主机系统的标识信息。

#include <sys/utsname.h>

struct utsname{
    char sysname[_UTSNAME_SYSNAME_LENGTH];
    char nodename[_UTSNAME_NODENAME_LENGTH];
    char release[_UTSNAME_RELEASE_LENGTH];
    char version[_UTSNAME_VERSION_LENGTH];
    char machine[_UTSNAME_MACHINE_LENGTH];
  };

int uname(struct utsname *utsbuf);

//成功返回0,失败返回-1

在linux中这些字段长度均为65

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/utsname.h>

int
main(int argc, char *argv[])
{
    struct utsname uts;

    if (uname(&uts) == -1)
        perror("uname");

    printf("Node name:   %s\n", uts.nodename);
    printf("System name: %s\n", uts.sysname);
    printf("Release:     %s\n", uts.release);
    printf("Version:     %s\n", uts.version);
    printf("Machine:     %s\n", uts.machine);
    exit(EXIT_SUCCESS);
}

/*
Node name:   izj6cfw9yi1iqoik31tqbgz
System name: Linux
Release:     3.10.0-693.2.2.el7.x86_64
Version:     #1 SMP Tue Sep 12 22:26:13 UTC 2017
Machine:     x86_64
*/

在linux下,/proc/sys/kernel目录下3个文件提供了与utsname结构的sysname、release和version字段相同的信息。

 utsname/proc 
 sysname /proc/sys/kernel/ostype
 release /proc/sys/kernel/osrelease
 version /proc/sys/kernel/version


linux命令uname也可以打印出系统主机信息

uname -a

Linux izj6cfw9yi1iqoik31tqbgz 3.10.0-693.2.2.el7.x86_64 #1 SMP Tue Sep 12 22:26:13 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux



上一篇: linux c时间
下一篇: linux文件io缓冲
作者邮箱: 203328517@qq.com