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

2018-05-22 09:32:32

为了更方便的访问内核信息,许多现代的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系统和进程信息做了简单的介绍,如果有疑问可以给我留言。


备注

1.编译器版本gcc4.8,运行环境centos7 64位
2.原文地址http://www.freecls.com/a/2712/30

©著作权归作者所有
收藏
推荐阅读
  • err
    linux c时间

    日历时间#include &lt;sys/time.h&gt; struct timeval{ time_t tv_sec; /*自1970-01...

  • linux进程凭证(权限)

    每个进程都有一套用数字表示的用户id和组id,这些id决定了进程执行时具体的权限。实际用户id和实际组id这2个id决定了进程所属的用户和组。假设我们用root用户登录,那么我们在shell中创建的新...

  • linux用户和组

    linux上每个用户都拥有一个唯一的用户名和一个相对应的用户id(uid),用户可以隶属于一个或多个组。每个组也拥有一个唯一的组名和组id(gid)。用户和组主要是用来控制资源访问权限的。记录用户相关...

  • err
    linux动态内存分配

    进程可以通过增加堆的大小来分配内存,堆就是一段长度可变的连续的虚拟内存,开始于未初始化数据段末尾,随着内存的分配和释放增减。通常堆的当前内存边界称为program bre...

  • err
    linux进程

    进程是一个可执行程序的实例。程序包含了一系列信息,这些信息描述了如何在运行时创建一个进程,所包含的内容如下。1.二进制格式标识,linux上用的是elf格式2.机器语言指...

  • nginx模块 ngx_http_headers_module

    ngx_http_headers_module 模块是用来增加 Expires 和 Cache-control,或者是任意的响应头。Syntax: add_header name value [alw...

  • nginx模块 ngx_http_gunzip_module、ngx_http_gzip_module、ngx_http_gzip_static_module

    ngx_http_gunzip_module 模块将文件解压缩后并在响应头加上 "Content-Encoding: gzip" 返回给客户端。为了解决客户端不支持gzip压缩。编译的时候带上 --w...

  • nginx模块 ngx_http_flv_module、ngx_http_mp4_module

    ngx_http_flv_module模块提供了对 flv 视频的伪流支持。编译的时候带上 --with-http_flv_module。它会根据指定的 start 参数来指定跳过多少字节,并在返回数...

  • nginx模块 ngx_http_fastcgi_module

    ngx_http_fastcgi_module 模块使得nginx可以与 fastcgi 服务器通信。比如目前要使得 nginx 支持 php 就得使用 fastcgi技术,在服务器上装上 nginx...

  • nginx模块 ngx_http_autoindex_module

    ngx_http_autoindex_module 模块可以将uri以 / 结尾时,列出里面的文件和目录。Syntax: autoindex on | off; Default: autoindex ...

简介
天降大任于斯人也,必先苦其心志。