Linux系統編程(第2版)筆記 (本書基本上就是Linux C API的簡單使用說明,入門層級的)

來源:互聯網
上載者:User

標籤:linux c   posix   系統編程   gcc   epoll   

Linux系統編程(第2版)跳轉至: 導航、 搜尋
目錄
  • 1入門和基本概念
  • 2檔案I/O
  • 3緩衝I/O
  • 4進階檔案I/O
  • 5進程管理
  • 6進階進程管理
  • 7線程
  • 8檔案和目錄管理
  • 9記憶體管理
  • 10訊號
  • 11時間(這裡談不上系統編程了,就是C庫API)
  • 12附錄A C語言的GCC擴充
  • 13附錄B 參考書目
入門和基本概念檔案I/O
  1. read(): EINTR EAGAIN
    1. 其他錯誤:EBADF EFAULT EINVAL EIO
  2. Append模式:每次write之前的檔案位置更新是原子操作
  3. 延遲寫:/proc/sys/vm/dirty_expire_centisecs
  4. O_DIRECT:長度、位移均應是底層裝置扇區(一般4KB)的整數倍
  5. lseek --> pread/pwrite:避免了多個線程操作同一個fd時的競爭
  6. p51 select()和poll()都是水平觸發,不是邊緣觸發
  7. poll() vs select()
    1. 對值較大的檔案描述符,後者要檢查集合中的每個位,而前者只是個鏈表(但是複雜的資料結構怎麼傳遞進核心的?)
    2. select()返回時重新建立fd_set,而poll()會把events和revents分開
  8. VFS、頁緩衝、頁回寫
緩衝I/O
  1. p72 ungetc:只要有足夠的記憶體,Linux允許無限次放回
  2. p72 rewind(stream) => fseek(stream, 0, SEEK_SET)且清空錯誤
  3. p80 fflush()只是把使用者緩衝資料寫入核心緩衝,不保證最終寫到物理介質上(fsync)
  4. setvbuf:_IO{N,L,F}BUF 無緩衝/行緩衝/塊緩衝
  5. flockfile:允許遞迴加鎖?
進階檔案I/O
  1. 向量I/O?:readv/writev
  2. epoll(Linux專有?)
    1. epoll_create1
    2. epoll_ctl(epfd, op, fd, event) <-- 這個API看上去夠複雜的了
      1. event->events |= EPOLLET; 邊緣觸發?(非阻塞I/O,需要仔細檢查EAGAIN?)
    3. epoll_wait
  3. mmap
    1. long page_size = sysconf( _SC_PAGESIZE ); //或getpagesize()、直接PAGE_SIZE
    2. p109 庫函數如glibc,經常使用mremap()來實現高效的realloc()
    3. POSIX.1 mprotect() 要麼唯讀,要麼唯寫,要麼可執行,不能同時
    4. madvise():準確預讀?(除非是POSIX_FADV_RANDOM)
  4. synchronnous vs synchronized
    1. 非同步I/O(aio)
  5. I/O調度器
    1. 基本操作:合并、排序
    2. Deadline
    3. Anticipatory
    4. CFQ
    5. Noop(不排序)
    6. 排序:按絕對路徑/inode/物理塊
進程管理
  1. execl
  2. fork
    1. COW:這些頁被標記為唯讀,如果有進程試圖修改,就會發生缺頁中斷
  3. fork + exec => vfork:不要用。嚴格來講,vfork是有bug的,考慮當exec調用失敗,父進程將一直被掛起...
  4. POSIX/C89 exit()
    1. atexit
    2. SIGCHLD
  5. 等待子進程終止
    1. wait
    2. waitpid
    3. waitid*
    4. BSD wait3 wait4(這裡3,4指參數個數)
    5. system
      1. 在執行command過程中,會阻塞SIGCHLD,同時SIGINT、SIGQUIT會被忽略
      2. p153 利用fork()、exec系統調用和waitpid()實現system()是一個非常有用的練習
      3. 安全隱患*
  6. 使用者和組*
    1. {實際、有效、保留}使用者ID/組ID(由於允許setuid/setgid,導致這裡的複雜性,有沒有更好一點的設計方法?)
  7. 會話和進程組(只在實現shell時需要瞭解吧?略)
  8. 守護進程
    1. 大致處理:pid=fork() --> setsid() --> chdir("/") --> chose(0..NR_OPEN) --> open("/dev/null", O_RDWR) --> dup(0);dup(0)
    2. daemon(nochdir, noclose)
進階進程管理
  1. CPU約束 vs I/O約束
  2. CFS(根據權值,而非時間片)
  3. sched_yield()
  4. nice(人品值) -_-
    1. 更好的:get/setpriority
    2. ioprio_get/set
  5. sched_get/setaffinity
  6. 即時系統(這裡討論的內容似乎有點過多了)
    1. 延遲、抖動*、截止期限
    2. 即時調度策略(靜態優先順序,不受nice影響):SCHED_FIFO/RR/OTHER
  7. 資源現狀(rlimit)*
線程
  1. p205 coroutines和fibers(超出了本書的探討範疇?k)
  2. p212 鎖住資料,而不是代碼
  3. Pthreads
    1. LinuxThreads -> NPTL ( -> NGPT?)
    2. pthread_setcancelstate/type, pthread_cancel
    3. join(應該只有一個可以)和detach(使得不可join)
    4. 互斥*
檔案和目錄管理
  1. stat/lstat/fstat
  2. chmod/fchmod
  3. chown/lchown/fchown
  4. 擴充屬性xattr(略)
  5. getcwd
  6. chdir/fchdir
  7. mkdir/rmdir/opendir/readdir/closedir/getdents
  8. link(oldpath, newpath)
  9. symlink
  10. unlink
  11. 移動檔案:rename
  12. 裝置節點
    1. /dev/null, /dev/zero, /dev/full
    2. /dev/random, /dev/urandom
  13. 帶外通訊(ioctl)
  14. inotify
    1. p270 零長度數組(但是實際上導致記憶體配置了許多不同大小的塊?)
記憶體管理
  1. 匿名記憶體映射(不會造成資料區段片段?)
    1. glibc用來滿足大的分配,臨界值一般為128KB
    2. p = mmap(NULL, 512*1024, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
  2. mallopt*
    1. $ MALLOC_CHECK=1 ./test
  3. p300 不要使用alloca()分配的記憶體作為函數調用的參數
    1. C99變長數組(VLAs):char buf[i];
  4. 記憶體操作
    1. memset, bzero ==〉優先使用calloc?
    2. memcmp
    3. memmove:可安全處理記憶體地區重疊問題(memcpy不支援)
  5. mlock*
  6. 樂觀的分配策略(僅到實際寫時才分配), OOM Killer
訊號
  1. p329 在訊號中確保可重新進入的函數*
  2. 訊號集*
    1. sigprocmask
    2. sigpending
    3. sigsuspend
    4. sigaction
時間(這裡談不上系統編程了,就是C庫API)
  1. typedef long time_t;
  2. struct timeval { tv_sec; tv_usec; }
  3. struct tm { ... }
  4. time --> gettimeofday
附錄A C語言的GCC擴充
  1. __attribute__((noinline/pure/const/noreturn/...))
  2. likely(x)/unlikely(x)
  3. __builtin_return_address
  4. case 1 ... 10:
附錄B 參考書目 

Linux系統編程(第2版)筆記 (本書基本上就是Linux C API的簡單使用說明,入門層級的)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.