首页 > 代码库 > 《Linux/Unix系统编程手册》读书笔记7 (/proc文件的简介和运用)
《Linux/Unix系统编程手册》读书笔记7 (/proc文件的简介和运用)
《Linux/Unix系统编程手册》读书笔记 目录
第11章
这章主要讲了关于Linux和UNIX的系统资源的限制。
关于限制都存在一个最小值,这些最小值为<limits.h>文件中的常量。
通过cat 命令查看:
lancelot@debian:~/Code/tlpi$ cat /usr/include/limits.h /* Copyright (C) 1991, 1992, 1996, 1997, 1998, 1999, 2000, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ /* * ISO C99 Standard: 7.10/5.2.4.2.1 Sizes of integer types <limits.h> */ #ifndef _LIBC_LIMITS_H_ #define _LIBC_LIMITS_H_ 1 #include <features.h> /* Maximum length of any multibyte character in any locale. We define this value here since the gcc header does not define the correct value. */ #define MB_LEN_MAX 16 /* If we are not using GNU CC we have to define all the symbols ourself. Otherwise use gcc‘s definitions (see below). */ #if !defined __GNUC__ || __GNUC__ < 2 /* We only protect from multiple inclusion here, because all the other #include‘s protect themselves, and in GCC 2 we may #include_next through multiple copies of this file before we get to GCC‘s. */ # ifndef _LIMITS_H # define _LIMITS_H 1 #include <bits/wordsize.h> /* We don‘t have #include_next. Define ANSI <limits.h> for standard 32-bit words. */ /* These assume 8-bit `char‘s, 16-bit `short int‘s, and 32-bit `int‘s and `long int‘s. */ /* Number of bits in a `char‘. */ # define CHAR_BIT 8 /* Minimum and maximum values a `signed char‘ can hold. */ # define SCHAR_MIN (-128) # define SCHAR_MAX 127 /* Maximum value an `unsigned char‘ can hold. (Minimum is 0.) */ # define UCHAR_MAX 255 /* Minimum and maximum values a `char‘ can hold. */ # ifdef __CHAR_UNSIGNED__ # define CHAR_MIN 0 # define CHAR_MAX UCHAR_MAX # else # define CHAR_MIN SCHAR_MIN # define CHAR_MAX SCHAR_MAX # endif /* Minimum and maximum values a `signed short int‘ can hold. */ # define SHRT_MIN (-32768) # define SHRT_MAX 32767 /* Maximum value an `unsigned short int‘ can hold. (Minimum is 0.) */ # define USHRT_MAX 65535 /* Minimum and maximum values a `signed int‘ can hold. */ # define INT_MIN (-INT_MAX - 1) # define INT_MAX 2147483647 /* Maximum value an `unsigned int‘ can hold. (Minimum is 0.) */ # define UINT_MAX 4294967295U /* Minimum and maximum values a `signed long int‘ can hold. */ # if __WORDSIZE == 64 # define LONG_MAX 9223372036854775807L # else # define LONG_MAX 2147483647L # endif # define LONG_MIN (-LONG_MAX - 1L) /* Maximum value an `unsigned long int‘ can hold. (Minimum is 0.) */ # if __WORDSIZE == 64 # define ULONG_MAX 18446744073709551615UL # else # define ULONG_MAX 4294967295UL # endif # ifdef __USE_ISOC99 /* Minimum and maximum values a `signed long long int‘ can hold. */ # define LLONG_MAX 9223372036854775807LL # define LLONG_MIN (-LLONG_MAX - 1LL) /* Maximum value an `unsigned long long int‘ can hold. (Minimum is 0.) */ # define ULLONG_MAX 18446744073709551615ULL # endif /* ISO C99 */ # endif /* limits.h */ #endif /* GCC 2. */ #endif /* !_LIBC_LIMITS_H_ */ /* Get the compiler‘s limits.h, which defines almost all the ISO constants. We put this #include_next outside the double inclusion check because it should be possible to include this file more than once and still get the definitions from gcc‘s header. */ #if defined __GNUC__ && !defined _GCC_LIMITS_H_ /* `_GCC_LIMITS_H_‘ is what GCC‘s file defines. */ # include_next <limits.h> #endif /* The <limits.h> files in some gcc versions don‘t define LLONG_MIN, LLONG_MAX, and ULLONG_MAX. Instead only the values gcc defined for ages are available. */ #if defined __USE_ISOC99 && defined __GNUC__ # ifndef LLONG_MIN # define LLONG_MIN (-LLONG_MAX-1) # endif # ifndef LLONG_MAX # define LLONG_MAX __LONG_LONG_MAX__ # endif # ifndef ULLONG_MAX # define ULLONG_MAX (LLONG_MAX * 2ULL + 1) # endif #endif #ifdef __USE_POSIX /* POSIX adds things to <limits.h>. */ # include <bits/posix1_lim.h> #endif #ifdef __USE_POSIX2 # include <bits/posix2_lim.h> #endif #ifdef __USE_XOPEN # include <bits/xopen_lim.h> #endif
我们还可以通过在shell用getconf获取限制:
PS:OPEN_MAX为进程同时最多可以打开的文件描述符的数量。
lancelot@debian:~/Code/tlpi$ getconf OPEN_MAX 1024
第12章
这章主要将了系统和进程信息
/proc虚拟文件系统:维基
首先我们来看看/proc有些什么
lancelot@debian:~/Code/tlpi$ ls /proc/ 1 11994 1652 200 252 2712 32 3869 4156 4297 4442 4577 530 acpi execdomains kpageflags softirqs 10 12 17 2001 2551 2775 33 3870 4165 4299 4451 4579 5318 asound fb loadavg stat 10002 12017 19 202 26 28 3345 3927 4168 4401 4457 4580 589 ati filesystems locks swaps 10008 13 191 203 2609 2815 3346 396 4169 4403 4464 4583 6 buddyinfo fs meminfo sys 10010 14 194 21 2610 2869 34 4 4173 4404 4483 4584 6410 bus interrupts misc sysrq-trigger 10235 140 195 22 2612 2879 3410 40 4177 4407 4485 4622 6415 cgroups iomem modules sysvipc 10575 15 1956 23 2641 29 35 4000 4179 4410 4496 4627 667 cmdline ioports mounts timer_list 11 158 196 2384 2668 2970 3798 4085 4181 4412 4500 4632 7 consoles irq mtrr timer_stats 11377 16 198 2399 2669 2980 3828 4102 4186 4415 4503 4637 7733 cpuinfo kallsyms net tty 11640 1644 1987 24 2670 2982 3864 4103 4190 4422 4511 4642 8 crypto kcore pagetypeinfo uptime 11659 1645 1992 2480 2671 3 3865 4107 4196 4424 4516 4647 8167 devices keys partitions version 11704 1646 1994 25 2672 30 3866 4108 4204 4436 4518 5248 8168 diskstats key-users sched_debug vmallocinfo 11967 1647 2 251 27 3011 3867 4109 4211 4438 4526 5254 8169 dma kmsg self vmstat 11988 1651 20 2515 2710 31 3868 4115 4217 4439 4570 529 9 driver kpagecount slabinfo zoneinfo
那些数字是进程ID(PID),每个进程ID都有其独自的子文件夹,里面包含进程的相关信息。
通过PID为1的进程(init)来说明。
lancelot@debian:~/Code/tlpi$ sudo ls -l /proc/1 [sudo] password for lancelot: 总用量 0 dr-xr-xr-x 2 root root 0 4月 28 22:40 attr -rw-r--r-- 1 root root 0 4月 28 22:40 autogroup -r-------- 1 root root 0 4月 28 22:40 auxv -r--r--r-- 1 root root 0 4月 28 22:40 cgroup --w------- 1 root root 0 4月 28 22:40 clear_refs -r--r--r-- 1 root root 0 4月 28 12:26 cmdline -rw-r--r-- 1 root root 0 4月 28 22:40 comm -rw-r--r-- 1 root root 0 4月 28 22:40 coredump_filter -r--r--r-- 1 root root 0 4月 28 22:40 cpuset lrwxrwxrwx 1 root root 0 4月 28 22:40 cwd -> / -r-------- 1 root root 0 4月 28 22:40 environ lrwxrwxrwx 1 root root 0 4月 28 12:26 exe -> /sbin/init dr-x------ 2 root root 0 4月 28 22:40 fd dr-x------ 2 root root 0 4月 28 22:40 fdinfo -r-------- 1 root root 0 4月 28 22:40 io -r--r--r-- 1 root root 0 4月 28 12:27 limits -rw-r--r-- 1 root root 0 4月 28 22:40 loginuid -r--r--r-- 1 root root 0 4月 28 22:40 maps -rw------- 1 root root 0 4月 28 22:40 mem -r--r--r-- 1 root root 0 4月 28 22:40 mountinfo -r--r--r-- 1 root root 0 4月 28 22:40 mounts -r-------- 1 root root 0 4月 28 22:40 mountstats dr-xr-xr-x 6 root root 0 4月 28 22:40 net dr-x--x--x 2 root root 0 4月 28 22:40 ns -r--r--r-- 1 root root 0 4月 28 22:40 numa_maps -rw-r--r-- 1 root root 0 4月 28 22:40 oom_adj -r--r--r-- 1 root root 0 4月 28 22:40 oom_score -rw-r--r-- 1 root root 0 4月 28 12:29 oom_score_adj -r--r--r-- 1 root root 0 4月 28 22:40 pagemap -r--r--r-- 1 root root 0 4月 28 22:40 personality lrwxrwxrwx 1 root root 0 4月 28 22:40 root -> / -rw-r--r-- 1 root root 0 4月 28 22:40 sched -r--r--r-- 1 root root 0 4月 28 22:40 sessionid -r--r--r-- 1 root root 0 4月 28 22:40 smaps -r--r--r-- 1 root root 0 4月 28 22:40 stack -r--r--r-- 1 root root 0 4月 28 12:26 stat -r--r--r-- 1 root root 0 4月 28 22:40 statm -r--r--r-- 1 root root 0 4月 28 12:26 status -r--r--r-- 1 root root 0 4月 28 22:40 syscall dr-xr-xr-x 3 root root 0 4月 28 22:40 task -r--r--r-- 1 root root 0 4月 28 22:40 wchan
其中
cmdline是以‘\0‘分隔的命令参数
cwd是指向当前工作目录的符号链接,可以看出init当前工作目录为根目录。
environ是环境列表,以‘\0‘分隔
HOME=/init=/sbin/initTERM=linuxBOOT_IMAGE=/vmlinuz-3.2.0-4-amd64PATH=/sbin:/usr/sbin:/bin:/usr/binPWD=/rootmnt=/root
exe是指向正在执行文件的符号链接,正在执行文件为/sbin/init。
fd是文件目录,包含指向由该进程打开文件的符号链接
lancelot@debian:~/Code/tlpi$ sudo ls -l /proc/1/fd 总用量 0 lrwx------ 1 root root 64 4月 28 22:52 10 -> /run/initctl
maps为内存映射
lancelot@debian:~/Code/tlpi$ sudo cat /proc/1/maps 00400000-00409000 r-xp 00000000 08:08 9306173 /sbin/init 00608000-00609000 rw-p 00008000 08:08 9306173 /sbin/init 01e15000-01e36000 rw-p 00000000 00:00 0 [heap] 7f5109159000-7f510915b000 r-xp 00000000 08:08 1838382 /lib/x86_64-linux-gnu/libdl-2.13.so 7f510915b000-7f510935b000 ---p 00002000 08:08 1838382 /lib/x86_64-linux-gnu/libdl-2.13.so 7f510935b000-7f510935c000 r--p 00002000 08:08 1838382 /lib/x86_64-linux-gnu/libdl-2.13.so 7f510935c000-7f510935d000 rw-p 00003000 08:08 1838382 /lib/x86_64-linux-gnu/libdl-2.13.so 7f510935d000-7f51094df000 r-xp 00000000 08:08 1835094 /lib/x86_64-linux-gnu/libc-2.13.so 7f51094df000-7f51096de000 ---p 00182000 08:08 1835094 /lib/x86_64-linux-gnu/libc-2.13.so 7f51096de000-7f51096e2000 r--p 00181000 08:08 1835094 /lib/x86_64-linux-gnu/libc-2.13.so 7f51096e2000-7f51096e3000 rw-p 00185000 08:08 1835094 /lib/x86_64-linux-gnu/libc-2.13.so 7f51096e3000-7f51096e8000 rw-p 00000000 00:00 0 7f51096e8000-7f5109706000 r-xp 00000000 08:08 1835054 /lib/x86_64-linux-gnu/libselinux.so.1 7f5109706000-7f5109905000 ---p 0001e000 08:08 1835054 /lib/x86_64-linux-gnu/libselinux.so.1 7f5109905000-7f5109906000 r--p 0001d000 08:08 1835054 /lib/x86_64-linux-gnu/libselinux.so.1 7f5109906000-7f5109907000 rw-p 0001e000 08:08 1835054 /lib/x86_64-linux-gnu/libselinux.so.1 7f5109907000-7f5109908000 rw-p 00000000 00:00 0 7f5109908000-7f5109947000 r-xp 00000000 08:08 1835059 /lib/x86_64-linux-gnu/libsepol.so.1 7f5109947000-7f5109b46000 ---p 0003f000 08:08 1835059 /lib/x86_64-linux-gnu/libsepol.so.1 7f5109b46000-7f5109b47000 r--p 0003e000 08:08 1835059 /lib/x86_64-linux-gnu/libsepol.so.1 7f5109b47000-7f5109b48000 rw-p 0003f000 08:08 1835059 /lib/x86_64-linux-gnu/libsepol.so.1 7f5109b48000-7f5109b68000 r-xp 00000000 08:08 1838390 /lib/x86_64-linux-gnu/ld-2.13.so 7f5109d4a000-7f5109d4e000 rw-p 00000000 00:00 0 7f5109d65000-7f5109d67000 rw-p 00000000 00:00 0 7f5109d67000-7f5109d68000 r--p 0001f000 08:08 1838390 /lib/x86_64-linux-gnu/ld-2.13.so 7f5109d68000-7f5109d69000 rw-p 00020000 08:08 1838390 /lib/x86_64-linux-gnu/ld-2.13.so 7f5109d69000-7f5109d6a000 rw-p 00000000 00:00 0 7fffc8fe9000-7fffc900a000 rw-p 00000000 00:00 0 [stack] 7fffc9191000-7fffc9192000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
mem为进程虚拟内存
mounts为进程的安装点
lancelot@debian:~/Code/tlpi$ sudo cat /proc/1/mounts rootfs / rootfs rw 0 0 sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0 proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0 udev /dev devtmpfs rw,relatime,size=10240k,nr_inodes=958260,mode=755 0 0 devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0 tmpfs /run tmpfs rw,nosuid,noexec,relatime,size=767824k,mode=755 0 0 /dev/disk/by-uuid/c2a06636-4fcf-4701-8f46-6415015254a0 / ext4 rw,relatime,errors=remount-ro,user_xattr,barrier=1,data=http://www.mamicode.com/ordered 0 0 tmpfs /run/lock tmpfs rw,nosuid,nodev,noexec,relatime,size=5120k 0 0 tmpfs /run/shm tmpfs rw,nosuid,nodev,noexec,relatime,size=1535640k 0 0 /dev/sda7 /boot ext4 rw,relatime,user_xattr,barrier=1,stripe=4,data=http://www.mamicode.com/ordered 0 0 /dev/sda5 /home ext4 rw,relatime,user_xattr,barrier=1,data=http://www.mamicode.com/ordered 0 0 /dev/sda6 /opt ext4 rw,relatime,user_xattr,barrier=1,data=http://www.mamicode.com/ordered 0 0 rpc_pipefs /var/lib/nfs/rpc_pipefs rpc_pipefs rw,relatime 0 0 binfmt_misc /proc/sys/fs/binfmt_misc binfmt_misc rw,nosuid,nodev,noexec,relatime 0 0
root为指向根目录的符号链接
status记录着进程的ID、内存使用情况、信号等信息。
lancelot@debian:~/Code/tlpi$ sudo cat /proc/1/status Name: init State: S (sleeping) Tgid: 1 Pid: 1 PPid: 0 TracerPid: 0 Uid: 0 0 0 0 Gid: 0 0 0 0 FDSize: 64 Groups: VmPeak: 10652 kB VmSize: 10648 kB VmLck: 0 kB VmPin: 0 kB VmHWM: 788 kB VmRSS: 788 kB VmData: 188 kB VmStk: 136 kB VmExe: 36 kB VmLib: 2052 kB VmPTE: 44 kB VmSwap: 0 kB Threads: 1 SigQ: 0/59891 SigPnd: 0000000000000000 ShdPnd: 0000000000000000 SigBlk: 0000000000000000 SigIgn: fffffffe57f0d8fc SigCgt: 00000000280b2603 CapInh: 0000000000000000 CapPrm: ffffffffffffffff CapEff: ffffffffffffffff CapBnd: ffffffffffffffff Cpus_allowed: f Cpus_allowed_list: 0-3 Mems_allowed: 00000000,00000001 Mems_allowed_list: 0 voluntary_ctxt_switches: 7947 nonvoluntary_ctxt_switches: 33
task下存放着该进程的每个线程的子目录(记录线程的信息)
lancelot@debian:~/Code/tlpi$ sudo ls -l /proc/1/task 总用量 0 dr-xr-xr-x 6 root root 0 4月 28 23:07 1
子目录的信息:
lancelot@debian:~/Code/tlpi$ sudo ls -l /proc/1/task/1 总用量 0 dr-xr-xr-x 2 root root 0 4月 28 23:08 attr -r-------- 1 root root 0 4月 28 23:08 auxv -r--r--r-- 1 root root 0 4月 28 23:08 cgroup --w------- 1 root root 0 4月 28 23:08 clear_refs -r--r--r-- 1 root root 0 4月 28 23:08 cmdline -rw-r--r-- 1 root root 0 4月 28 23:08 comm -r--r--r-- 1 root root 0 4月 28 23:08 cpuset lrwxrwxrwx 1 root root 0 4月 28 23:08 cwd -> / -r-------- 1 root root 0 4月 28 23:08 environ lrwxrwxrwx 1 root root 0 4月 28 23:08 exe -> /sbin/init dr-x------ 2 root root 0 4月 28 23:08 fd dr-x------ 2 root root 0 4月 28 23:08 fdinfo -r-------- 1 root root 0 4月 28 23:08 io -r--r--r-- 1 root root 0 4月 28 23:08 limits -rw-r--r-- 1 root root 0 4月 28 23:08 loginuid -r--r--r-- 1 root root 0 4月 28 23:08 maps -rw------- 1 root root 0 4月 28 23:08 mem -r--r--r-- 1 root root 0 4月 28 23:08 mountinfo -r--r--r-- 1 root root 0 4月 28 23:08 mounts dr-x--x--x 2 root root 0 4月 28 23:08 ns -r--r--r-- 1 root root 0 4月 28 23:08 numa_maps -rw-r--r-- 1 root root 0 4月 28 23:08 oom_adj -r--r--r-- 1 root root 0 4月 28 23:08 oom_score -rw-r--r-- 1 root root 0 4月 28 23:08 oom_score_adj -r--r--r-- 1 root root 0 4月 28 23:08 pagemap -r--r--r-- 1 root root 0 4月 28 23:08 personality lrwxrwxrwx 1 root root 0 4月 28 23:08 root -> / -rw-r--r-- 1 root root 0 4月 28 23:08 sched -r--r--r-- 1 root root 0 4月 28 23:08 sessionid -r--r--r-- 1 root root 0 4月 28 23:08 smaps -r--r--r-- 1 root root 0 4月 28 23:08 stack -r--r--r-- 1 root root 0 4月 28 23:08 stat -r--r--r-- 1 root root 0 4月 28 23:08 statm -r--r--r-- 1 root root 0 4月 28 23:08 status -r--r--r-- 1 root root 0 4月 28 23:08 syscall -r--r--r-- 1 root root 0 4月 28 23:08 wchan
通过访问/proc文件可以获取很多有用的信息。
练习:
12-1.编写一个程序,以用户名作为命令行参数,列表显示该用户下所有正在运行的进程ID和命令名。通过分析系统中/proc/PID/status文件的Name和UID各行信息,可以思想此功能。
1 /* 2 * ===================================================================================== 3 * 4 * Filename: 12.1.c 5 * 6 * Description: 7 * 8 * Version: 1.0 9 * Created: 2014年05月01日 21时03分09秒 10 * Revision: none 11 * Compiler: gcc 12 * 13 * Author: alan (), alan19920626@gmail.com 14 * Organization: 15 * 16 * ===================================================================================== 17 */ 18 19 #include <fcntl.h> 20 #include <dirent.h> 21 #include <pwd.h> 22 #include <ctype.h> 23 #include <sys/stat.h> 24 #include "tlpi_hdr.h" 25 #include "ugid_functions.h" 26 27 #define MAX_LINE 1000 28 29 int main(int argc, char *argv[]){ 30 DIR *dirp; 31 struct dirent *dp; 32 int fd; 33 FILE *fp; 34 char path[MAX_LINE], cmd[MAX_LINE], line[MAX_LINE]; 35 char *p, *q; 36 int numRead; 37 uid_t id, p_uid; 38 pid_t pid; 39 40 if(argc != 2 || strcmp(argv[1], "--help") == 0) 41 usageErr("%s username"); 42 43 id = userIdFromName(argv[1]); //获取用户名对应的UID 44 if(id == -1) 45 errExit("userIdFromName"); 46 47 dirp = opendir("/proc"); //打开/proc文件 48 if(dirp == NULL) 49 errExit("opendir"); 50 51 printf("Uid: %ld\n", id); 52 while((dp = readdir(dirp)) != NULL){ 53 if(dp->d_type != DT_DIR || !isdigit((unsigned char) dp->d_name[0])) //跳过类型文件类型不是目录和文件名不是数字的 54 continue; 55 56 snprintf(path, MAX_LINE, "/proc/%s/status", dp->d_name); 57 fp = fopen(path, "r"); //打开进程对应的status文件的文件流 58 p_uid = 0; 59 while(fgets(line, MAX_LINE, fp) != NULL){ //逐行获取信息 60 if(strncmp(line, "Name:", 5) == 0){ //当字符串的开始包含Name:为进程名 61 for(p = line + 5; *p != ‘\0‘ && isspace((unsigned char)*p); ++p) 62 ; 63 for(q = p; *q != ‘\0‘ && isgraph((unsigned char)*q); ++q) 64 ; 65 strncpy(cmd, p, (int)(q-p)); 66 cmd[(int)(q-p)] = ‘\0‘; 67 } 68 69 if(strncmp(line, "Pid:", 4) == 0){ //获取进程号 70 pid = strtol(line+4, NULL, 10); 71 } 72 73 if(strncmp(line, "Uid:", 4) == 0){ //获取有效用户号 74 p_uid = strtol(line+4, NULL, 10); 75 break; 76 } 77 } 78 fclose(fp); 79 if(p_uid == id) 80 printf("%5ld %s\n", p_uid, cmd); 81 } 82 exit(EXIT_SUCCESS); 83 }
刚开始打算用open和read来读取status的信息,但是不知道为什么只能测试是否包含"Name:",不能获取进程号和有效用户号,所以修改成通过fopen和fgets来读取status文件的信息。感觉这个练习比之前的难度大了,综合了比较多的系统调用和库函数,感觉还是用得不熟练。除了把书上的练习做了,还要找些东东来搞搞,练习一下。
测试结果:
lancelot@debian:~/Code/tlpi$ ./12.1 lancelot Uid: 1000 1000 bash 1000 startx 1000 xinit 1000 Xorg 1000 ck-launch-sessi 1000 ssh-agent 1000 x-session-manag 1000 dbus-launch 1000 dbus-daemon 1000 ibus-daemon 1000 ibus-gconf 1000 python 1000 ibus-x11 1000 gvfsd 1000 gconfd-2 1000 ibus-engine-sun 1000 gnome-settings- 1000 gnome-keyring-d 1000 pulseaudio 1000 gvfs-gdu-volume 1000 gvfs-afc-volume 1000 gvfs-gphoto2-vo 1000 gnome-shell 1000 gsd-printer 1000 nm-applet 1000 tracker-miner-f 1000 gdu-notificatio 1000 nautilus 1000 tracker-store 1000 gnome-screensav 1000 evolution-alarm 1000 gvfsd-trash 1000 evolution-calen 1000 gvfsd-burn 1000 evolution-addre 1000 goa-daemon 1000 gvfsd-metadata 1000 gnome-shell-cal 1000 mission-control 1000 chrome 1000 chrome 1000 chrome-sandbox 1000 chrome 1000 nacl_helper 1000 chrome 1000 chrome 1000 chrome 1000 chrome 1000 chrome 1000 chrome 1000 chrome 1000 chrome 1000 chrome 1000 chrome 1000 dconf-service 1000 guake 1000 gnome-pty-helpe 1000 bash 1000 gvim 1000 gedit 1000 gnome-pty-helpe 1000 bash 1000 bash 1000 12.1
-----------------------还有两题。。。又来挖坑了-------感觉对这些系统调用和库函数的熟练程度严重不够
-----------------------还要继续努力啊!!!!加油!!!!!---------------------------------------------------
-----------------------要把学习记录的进度加快,下册也快看了一个月,还有一大部分没看,而且代码也很多没实现