第11章node
這章主要講了關於Linux和UNIX的系統資源的限制。python
關於限制都存在一個最小值,這些最小值爲<limits.h>文件中的常量。linux
經過cat 命令查看:git
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獲取限制:redis
PS:OPEN_MAX爲進程同時最多能夠打開的文件描述符的數量。chrome
lancelot@debian:~/Code/tlpi$ getconf OPEN_MAX 1024
第12章shell
這章主要將了系統和進程信息編程
/proc虛擬文件系統:維基vim
首先咱們來看看/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=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=ordered 0 0 /dev/sda5 /home ext4 rw,relatime,user_xattr,barrier=1,data=ordered 0 0 /dev/sda6 /opt ext4 rw,relatime,user_xattr,barrier=1,data=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
-----------------------還有兩題。。。又來挖坑了-------感受對這些系統調用和庫函數的熟練程度嚴重不夠
-----------------------還要繼續努力啊!!!!加油!!!!!---------------------------------------------------
-----------------------要把學習記錄的進度加快,下冊也快看了一個月,還有一大部分沒看,並且代碼也不少沒實現