fork 系統調用

對本身知識儲備的感受就是過於膚淺,不少東西知其名後就不了了之
此係列博客將記錄進程分析的學習過程,但願可以多些深度linux

提到進程,最容易的想到就是fork系統調用,比較好和快速的找到的fork的相關信息就是 linux manual 了安全

fork(2)

fork - 建立一個新的進程

#include <unistd.h>

pid_t fork(void);

fork()經過複製被調用進程而建立一個新的進程,新進程稱爲子進程,被調用的進程稱爲父進程。多線程

父子進程分別在不一樣的地址空間運行,在調用 fork()時兩個內存空間具備相同的上下文 [1]。在內存寫入時,文件映射內存mmap(2) 和文件取消映射內存munmap(2)在一個進程內執行不會影響到其餘進程。異步

子進程對父進程徹底複製除了如下幾點:async

  • 子進程有惟一的進程ID,而且進程ID不等於任何已經存在的進程組getpgid(2)或者會話 [2]
  • 子進程的父進程IDgeppid(2)與父進程ID相同 [3]
  • 子進程不繼承父進程的內存鎖mlock(2), mlockall(2) [4]
  • 子進程資源佔用getrusage(2)和 CPU時間計數器times(2)被重置爲0 [5]
  • 子進程的懸掛信號集(set of pending signals)初始化爲空sigpending(2) [6]
  • 子進程不從父進程繼承信號量調整 semop(2) [7]
  • 子進程不從父進程繼承相關的記錄鎖 fcntl(2),可是從父進程繼承 fcntl(2)打開的文件描述符鎖 [8]
  • 子進程不繼承父進程的定時器 setitimer(2), alarm(2), timer_create(2) [9]
  • 子進程不從父進程繼承未完成的異步I/O操做aio_read(3) aio_write(3),也不從父進程繼承任何的異步I/O的上下文 io_setup(2) [10]

以上的進程屬性都在POSIX.1-2001中指定。父進程和子進程在如下特定於Linux的進程屬性方面也有所不一樣:函數

  • 子進程不繼承父進程目錄的變動通知,見fcntl(2)中的F_NOTIFY [11]
  • prctl(2)PR_SET_PDEATHSIG爲重置標誌,於是子進程不能接收到父進程終止的信號 [12]
  • 默認的計時器從值(slack value)設置爲父進程的當前計時器從值,見prctl(2)PR_SET_TIMERSLACK標誌 [13]
  • 已使用madvise(2)MADV_DONTFORK標誌標記的內存映射不會經過fork()繼承 [14]
  • 子進程的終止信號老是SIGCHLD,見 clone(2) [15]
  • 子進程不從父進程繼承由ioperm(2)設置的端口訪問權限位,子進程必須經過使用ioperm(2)打開任何權限位 [16]

如下幾個特色也需留意:學習

  • 子進程是以單線程的方式建立的。父進程整個虛擬地址空間都被複制到了子進程,包括互斥鎖、條件變量和其餘pthread對象的狀態;由此出現的問題時使用pthread_atfork(3)可能會有幫助。
  • 在多線程程序中使用fork()後,子進程能夠安全的只調用異步信號安全函數(async-signal-safe,見signal-safety(7))直到它調用 execve(2)的時候。
  • 子進程繼承父進程打開文件描述符的副本。子進程中的每一個文件描述符引用相同打開的文件描述符做爲父進程中對應的文件描述符。兩個文件描述符共享打開文件的狀態標誌,文件偏移量和信號驅動I/O屬性(見 fcntl(2)中的F_SETOWN F_SETSIG標誌)。
  • 子進程繼承父進程中打開消息隊列描述符的副本(見mq_overview(7))。子進程中每一個文件描述符引用相同已打開的消息隊列描述符做爲父進程中的對應的文件描述符,意味着兩個文件描述符共享相同的標誌(mq_flags)。
  • 子進程繼承父進程打開目錄流副本(見opendir(3))。POSIX.1-2001表示父和子進程中對應的目錄流能夠共享目錄流定位,Linux/glibc未實現。

[no] 表示待解決的問題 spa

相關文章
相關標籤/搜索