對本身知識儲備的感受就是過於膚淺,不少東西知其名後就不了了之
此係列博客將記錄進程分析的學習過程,但願可以多些深度linux
提到進程,最容易的想到就是fork
系統調用,比較好和快速的找到的fork的相關信息就是 linux manual 了安全
fork - 建立一個新的進程 #include <unistd.h> pid_t fork(void);
fork()
經過複製被調用進程而建立一個新的進程,新進程稱爲子進程,被調用的進程稱爲父進程。多線程
父子進程分別在不一樣的地址空間運行,在調用 fork()
時兩個內存空間具備相同的上下文 [1]。在內存寫入時,文件映射內存mmap(2)
和文件取消映射內存munmap(2)
在一個進程內執行不會影響到其餘進程。異步
子進程對父進程徹底複製除了如下幾點:async
getpgid(2)
或者會話 [2]。geppid(2)
與父進程ID相同 [3]。mlock(2), mlockall(2)
[4]。getrusage(2)
和 CPU時間計數器times(2)
被重置爲0 [5]。sigpending(2)
[6]。semop(2)
[7]。fcntl(2)
,可是從父進程繼承 fcntl(2)
打開的文件描述符鎖 [8]。setitimer(2), alarm(2), timer_create(2)
[9]。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]。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)
的時候。fcntl(2)
中的F_SETOWN F_SETSIG
標誌)。mq_overview(7)
)。子進程中每一個文件描述符引用相同已打開的消息隊列描述符做爲父進程中的對應的文件描述符,意味着兩個文件描述符共享相同的標誌(mq_flags)。opendir(3)
)。POSIX.1-2001表示父和子進程中對應的目錄流能夠共享目錄流定位,Linux/glibc未實現。[no] 表示待解決的問題 spa