《Linux/Unix系统编程手册》读书笔记7 (/proc文件的简介和运用)


《Linux/Unix系统编程手册》读书笔记 目录

第11章

这章主要讲了关于Linux和UNIX的系统资源的限制。

关于限制都存在一个最小值,这些最小值为<limits.h>文件中的常量。

通过cat 命令查看:

/usr/include/ _LIBC_LIMITS_H_ 1<features.h> MB_LEN_MAX 16 !defined __GNUC__ || __GNUC__ < 2 <bits/wordsize.h> - - -INT_MAX - __WORDSIZE == -LONG_MAX - __WORDSIZE == -LLONG_MAX - /* GCC 2. */ /* !_LIBC_LIMITS_H_ */ defined __GNUC__ && !defined _GCC_LIMITS_H_ <limits.h> defined __USE_ISOC99 && defined __GNUC__-LLONG_MAX-* 2ULL + <bits/posix1_lim.h> <bits/posix2_lim.h> <bits/xopen_lim.h> View Code

我们还可以通过在shell用getconf获取限制:

PS:OPEN_MAX为进程同时最多可以打开的文件描述符的数量。

lancelot@debian:~/Code/

第12章

这章主要将了系统和进程信息

/proc虚拟文件系统:维基

首先我们来看看/proc有些什么

lancelot@debian:~/Code/tlpi$  /proc/
                                                                    asound     fb           loadavg       
                                                                                                  bus        interrupts   misc          sysrq-                                                                                                                                                          crypto     kcore        pagetypeinfo  
                                                           diskstats  key-                                                                  driver     kpagecount   slabinfo      zoneinfo

那些数字是进程ID(PID),每个进程ID都有其独自的子文件夹,里面包含进程的相关信息。

通过PID为1的进程(init)来说明。

lancelot@debian:~/Code/tlpi$   -l /proc/] password -xr-xr-x  root root   4月  :-rw-r--r--  root root   4月  :-r--------  root root   4月  :-r--r--r--  root root   4月  :---------  root root   4月  :-r--r--r--  root root   4月  :-rw-r--r--  root root   4月  :-rw-r--r--  root root   4月  :-r--r--r--  root root   4月  : root root   4月  : cwd -> /
-r--------  root root   4月  : root root   4月  : exe -> /sbin/-x------  root root   4月  :-x------  root root   4月  :-r--------  root root   4月  :-r--r--r--  root root   4月  :-rw-r--r--  root root   4月  :-r--r--r--  root root   4月  :-rw-------  root root   4月  :-r--r--r--  root root   4月  :-r--r--r--  root root   4月  :-r--------  root root   4月  :-xr-xr-x  root root   4月  :-x--x--x  root root   4月  :-r--r--r--  root root   4月  :-rw-r--r--  root root   4月  :-r--r--r--  root root   4月  :-rw-r--r--  root root   4月  :-r--r--r--  root root   4月  :-r--r--r--  root root   4月  : root root   4月  : root -> /
-rw-r--r--  root root   4月  :-r--r--r--  root root   4月  :-r--r--r--  root root   4月  :-r--r--r--  root root   4月  :-r--r--r--  root root   4月  : 
-r--r--r--  root root   4月  :-r--r--r--  root root   4月  :-r--r--r--  root root   4月  :-xr-xr-x  root root   4月  :-r--r--r--  root root   4月  : wchan

其中

cmdline是以'\0'分隔的命令参数

cwd是指向当前工作目录的符号链接,可以看出init当前工作目录为根目录。

environ是环境列表,以'\0'分隔

HOME=/init=/sbin/initTERM=linuxBOOT_IMAGE=/vmlinuz-.--amd64PATH=/sbin:/usr/sbin:/bin:/usr/binPWD=/rootmnt=/root

exe是指向正在执行文件的符号链接,正在执行文件为/sbin/init。

fd是文件目录,包含指向由该进程打开文件的符号链接

lancelot@debian:~/Code/tlpi$   -l /proc//------  root root   4月  :  -> /run/initctl

maps为内存映射

/proc//- r-xp : /sbin/- rw-p : /sbin/-01e36000 rw-p : -7f510915b000 r-xp : /lib/x86_64-linux-gnu/libdl--7f510935b000 ---p : /lib/x86_64-linux-gnu/libdl--7f510935c000 r--p : /lib/x86_64-linux-gnu/libdl--7f510935d000 rw-p : /lib/x86_64-linux-gnu/libdl--7f51094df000 r-xp : /lib/x86_64-linux-gnu/libc--7f51096de000 ---p : /lib/x86_64-linux-gnu/libc--7f51096e2000 r--p : /lib/x86_64-linux-gnu/libc--7f51096e3000 rw-p : /lib/x86_64-linux-gnu/libc--7f51096e8000 rw-p : -7f5109706000 r-xp : /lib/x86_64-linux-gnu/libselinux.so.-7f5109905000 ---p 0001e000 : /lib/x86_64-linux-gnu/libselinux.so.-7f5109906000 r--p 0001d000 : /lib/x86_64-linux-gnu/libselinux.so.-7f5109907000 rw-p 0001e000 : /lib/x86_64-linux-gnu/libselinux.so.-7f5109908000 rw-p : -7f5109947000 r-xp : /lib/x86_64-linux-gnu/libsepol.so.-7f5109b46000 ---p 0003f000 : /lib/x86_64-linux-gnu/libsepol.so.-7f5109b47000 r--p 0003e000 : /lib/x86_64-linux-gnu/libsepol.so.-7f5109b48000 rw-p 0003f000 : /lib/x86_64-linux-gnu/libsepol.so.-7f5109b68000 r-xp : /lib/x86_64-linux-gnu/--7f5109d4e000 rw-p : -7f5109d67000 rw-p : -7f5109d68000 r--p 0001f000 : /lib/x86_64-linux-gnu/--7f5109d69000 rw-p : /lib/x86_64-linux-gnu/--7f5109d6a000 rw-p : -7fffc900a000 rw-p : -7fffc9192000 r-xp : -ffffffffff601000 r-xp : [vsyscall] View Code

mem为进程虚拟内存

mounts为进程的安装点

/proc/// rootfs rw /sys sysfs rw,nosuid,nodev,noexec,relatime /proc proc rw,nosuid,nodev,noexec,relatime /dev devtmpfs rw,relatime,size=10240k,nr_inodes=,mode= /dev/pts devpts rw,nosuid,noexec,relatime,gid=,mode=,ptmxmode= /run tmpfs rw,nosuid,noexec,relatime,size=767824k,mode= /dev/disk/by-uuid/c2a06636-4fcf--8f46-6415015254a0 / ext4 rw,relatime,errors=remount-ro,user_xattr,barrier=,data=ordered /run/lock tmpfs rw,nosuid,nodev,noexec,relatime,size=5120k /run/shm tmpfs rw,nosuid,nodev,noexec,relatime,size=1535640k /dev/sda7 /boot ext4 rw,relatime,user_xattr,barrier=,stripe=,data=ordered /dev/sda5 /home ext4 rw,relatime,user_xattr,barrier=,data=ordered /dev/sda6 /opt ext4 rw,relatime,user_xattr,barrier=,data=ordered /var/lib/nfs/rpc_pipefs rpc_pipefs rw,relatime /proc/sys/fs/binfmt_misc binfmt_misc rw,nosuid,nodev,noexec,relatime View Code

root为指向根目录的符号链接

status记录着进程的ID、内存使用情况、信号等信息。

/proc// /-, View Code

task下存放着该进程的每个线程的子目录(记录线程的信息)

lancelot@debian:~/Code/tlpi$   -l /proc//-xr-xr-x  root root   4月  : 

子目录的信息:

-l /proc//task/-xr-xr-x root root 4月 :-r-------- root root 4月 :-r--r--r-- root root 4月 :--------- root root 4月 :-r--r--r-- root root 4月 :-rw-r--r-- root root 4月 :-r--r--r-- root root 4月 : root root 4月 : cwd -> / -r-------- root root 4月 : root root 4月 : exe -> /sbin/-x------ root root 4月 :-x------ root root 4月 :-r-------- root root 4月 :-r--r--r-- root root 4月 :-rw-r--r-- root root 4月 :-r--r--r-- root root 4月 :-rw------- root root 4月 :-r--r--r-- root root 4月 :-r--r--r-- root root 4月 :-x--x--x root root 4月 :-r--r--r-- root root 4月 :-rw-r--r-- root root 4月 :-r--r--r-- root root 4月 :-rw-r--r-- root root 4月 :-r--r--r-- root root 4月 :-r--r--r-- root root 4月 : root root 4月 : root -> / -rw-r--r-- root root 4月 :-r--r--r-- root root 4月 :-r--r--r-- root root 4月 :-r--r--r-- root root 4月 :-r--r--r-- root root 4月 : -r--r--r-- root root 4月 :-r--r--r-- root root 4月 :-r--r--r-- root root 4月 :-r--r--r-- root root 4月 : wchan View Code

通过访问/proc文件可以获取很多有用的信息。

 

练习:

12-1.编写一个程序,以用户名作为命令行参数,列表显示该用户下所有正在运行的进程ID和命令名。通过分析系统中/proc/PID/status文件的Name和UID各行信息,可以思想此功能。

 
                 
 
 #include <fcntl.h>
 #include <dirent.h>
 #include <pwd.h>
 #include <ctype.h>
 #include <sys/stat.h>
 #include 
 #include 
 
  MAX_LINE 1000
 
  main( argc,  *     DIR *      dirent *          FILE *           *p, *        
     (argc !=  || strcmp(argv[], ) ==          usageErr( 
     id = userIdFromName(argv[]);        
     (id == -         errExit( 
     dirp = opendir();            
     (dirp ==         errExit( 
     printf(     ((dp = readdir(dirp)) !=         (dp->d_type != DT_DIR || !isdigit((unsigned ) dp->d_name[]))     
              
         snprintf(path, MAX_LINE, , dp->         fp = fopen(path, );                                                 
         p_uid =          (fgets(line, MAX_LINE, fp) != NULL){                              
             (strncmp(line, , ) == ){                                
                 (p = line + ; *p !=  && isspace((unsigned )*p); ++                  (q = p; *q !=  && isgraph((unsigned )*q); ++                  strncpy(cmd, p, ()(q-                 cmd[()(q-p)] =   
             (strncmp(line, , ) == ){                                 
                 pid = strtol(line+, NULL,   
             (strncmp(line, , ) == ){                                 
                 p_uid = strtol(line+, NULL,                              (p_uid ==             printf(   }

刚开始打算用open和read来读取status的信息,但是不知道为什么只能测试是否包含"Name:",不能获取进程号和有效用户号,所以修改成通过fopen和fgets来读取status文件的信息。感觉这个练习比之前的难度大了,综合了比较多的系统调用和库函数,感觉还是用得不熟练。除了把书上的练习做了,还要找些东东来搞搞,练习一下。

测试结果:

lancelot@debian:~/Code/tlpi$ ./
  ck-launch- ssh- x-session- dbus- dbus- ibus- ibus- ibus- gconfd-
  ibus-engine- gnome-settings-
  gnome-keyring- gvfs-gdu- gvfs-afc- gvfs-gphoto2- gnome- gsd- nm- tracker-miner- gdu- tracker- gnome- evolution- gvfsd- evolution- gvfsd- evolution- goa- gvfsd- gnome-shell- mission- chrome- dconf- gnome-pty- gnome-pty- 

 

-----------------------还有两题。。。又来挖坑了-------感觉对这些系统调用和库函数的熟练程度严重不够

-----------------------还要继续努力啊!!!!加油!!!!!---------------------------------------------------

-----------------------要把学习记录的进度加快,下册也快看了一个月,还有一大部分没看,而且代码也很多没实现

相关内容