The Linux Programming Interface 12 System And Process Information 系统和进程信息

The Linux Programming Interface

System And Process Interface

(01)主要内容,主要讨论/proc目录

In this chapter, we look at ways of accessing a variety of system and process information. The primary focus of the chapter is a discussion of the /proc file system.

(02)/proc/PID file

For each process on the system, the kernel provides a corresponding directory named /proc/PID, where PID is the ID of the process.

Within this directory are avrious files and subdirectories containing information about that process.

wang@wang:~$ cat /proc/1/status 
Name:	systemd
State:	S (sleeping)
Tgid:	1
Ngid:	0
Pid:	1
PPid:	0
TracerPid:	0
Uid:	0	0	0	0
Gid:	0	0	0	0
FDSize:	256
Groups:	
NStgid:	1
NSpid:	1
NSpgid:	1
NSsid:	1
VmPeak:	  185680 kB
VmSize:	  120036 kB
VmLck:	       0 kB
VmPin:	       0 kB
VmHWM:	    6260 kB
VmRSS:	    6128 kB
VmData:	   83788 kB
VmStk:	     136 kB
VmExe:	    1392 kB
VmLib:	    3660 kB
VmPTE:	     100 kB
VmPMD:	      12 kB
VmSwap:	       0 kB
HugetlbPages:	       0 kB
Threads:	1
SigQ:	0/14980
SigPnd:	0000000000000000
ShdPnd:	0000000000000000
SigBlk:	7be3c0fe28014a03
SigIgn:	0000000000001000
SigCgt:	00000001800004ec
CapInh:	0000000000000000
CapPrm:	0000003fffffffff
CapEff:	0000003fffffffff
CapBnd:	0000003fffffffff
CapAmb:	0000000000000000
Seccomp:	0
Cpus_allowed:	ff
Cpus_allowed_list:	0-7
Mems_allowed:	00000000,00000001
Mems_allowed_list:	0
voluntary_ctxt_switches:	2034
nonvoluntary_ctxt_switches:	926

(03) /proc/PID/fd

The /proc/PID/fd directory contains one symbolic link for each file descriptor that the process has open.

(04) /proc/PID/task

For each thread in this process, the kernel provides a subdirectory named /proc/PID/task/TID

(05)这个例子展示如何读和修改/proc文件

  1 #include <fcntl.h>
  2 #include "tlpi_hdr.h"
  3 
  4 #define MAX_LINE 100
  5 
  6 int main(int argc, char *argv[]) {
  7     int fd;
  8     char line[MAX_LINE];
  9     ssize_t n;
 10 
 11     fd = open("/proc/sys/kernel/pid_max", (argc > 1) ? O_RDWR : O_RDONLY);
 12     if (fd == -1)
 13         errExit("open");
 14 
 15     n = read(fd, line, MAX_LINE);
 16     if (n == -1)
 17         errExit("read");
 18 
 19     if(argc > 1)
 20         printf("Old value: ");
 21     printf("%.*s",(int)n, line);
 22 
 23     if(argc > 1) {
 24         if(write(fd, argv[1], strlen(argv[1])) != strlen(argv[1]))
 25             fatal("write() failed");
 26         system("echo /proc/sys/kernel/pid_max now contains 'cat /proc/sys/kernel/pid_max'");
 27     }
 28     exit(EXIT_FAILURE);
 29 }
最后的输出有问题,但是结果还是从32768变成10000.

(06) The uname() system call returns a range of identifying information abut the host system on which application is running, in the structure pointed to by utsbuf.

#include <sys/utsname.h>

int uname(struct utsname *utsbuf);

struct utsname {
	char sysname[_UTSNAME_LENGTH];		/* Implementation name */
	char nodename[_UTSNAME_LENGTH];		/* Node name on network */
	char release[_utsname_LENGTH];		/* Implementation relase level */
	...
};
(07)uname举例

  1 #define _GNU_SOURCE
  2 #include <sys/utsname.h>
  3 #include "tlpi_hdr.h"
  4 
  5 int main(int argc, char *argv[]) {
  6     struct utsname uts;
  7     if (uname(&uts) == -1)
  8         errExit("uname");
  9 
 10     printf("Node name:      %s\n", uts.nodename);
 11     printf("System name:    %s\n", uts.sysname);
 12     printf("Release:        %s\n", uts.release);
 13     printf("Version:        %s\n", uts.version);
 14     printf("Machine:        %s\n", uts.machine);
 15 
 16 #ifdef _GNU_SOURCE
 17     printf("Domain name:    %s\n", uts.domainname);
 18 #endif
 19     exit(EXIT_FAILURE);
 20 }
输出;

wang@wang:~/Documents/tlpi-dist/lib$ ./t_uname
Node name:        wang
System name:     Linux
Release:        4.4.0-64-generic
Version:        #85-Ubuntu SMP Mon Feb 20 11:50:30 UTC 2017
Machine:        x86_64
Domain name:     (none)

(08)总结

The /proc file system exposes a range of kernel information to application programs. Each /proc/PID subdirectory contains files and subdirectories that provide information about the processes whose ID match PID. Various other files and directories under /proc expose system-wide information that program can read and, in some cases, modify.

    The uname() system call allows us to discover the UNIX implementation and the type of machine on which an applicaton is running.

(09) 习题



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值