linux程序建立函式簡介

2021-08-20 03:08:33 字數 1360 閱讀 6785

linux將建立程序和執行所建立的程序分為2個階段。

第乙個階段是建立。父程序首先複製子程序,所複製出來的子程序擁有自己的任務結構體和系統堆疊,除此之外所有資源都與父程序共享。linux提供兩種方式複製子程序:乙個是fork(),另外乙個是clone()。fork()函式複製時將父程序的所以資源都通過複製資料結構進行了複製,然後傳遞給子程序,所以fork()函式不帶引數;clone()函式則是將部分父程序的資源的資料結構進行複製,複製哪些資源是可選擇的,這個可以通過引數設定,所以clone()函式帶引數,沒有複製的資源可以通過指標共享給子程序。

clone()函式的宣告如下:

int clone(int (*fn)(void *), void*child_stack, int flags, void *arg)

其中,fn為函式指標,此指標指向乙個函式體,即想要建立程序的靜態程式;

child_stack為給子程序分配系統堆疊的指標;

arg就是傳給子程序的引數;

flags為要複製資源的標誌:

clone_parent   建立的子程序的父程序是呼叫者的父程序,新程序與建立它的程序成了「兄弟」而不是「父子」

clone_fs           子程序與父程序共享相同的檔案系統,包括root、當前目錄、umask

clone_files      子程序與父程序共享相同的檔案描述符(file descriptor)表

clone_newns   在新的namespace啟動子程序,namespace描述了程序的檔案hierarchy

clone_sighand   子程序與父程序共享相同的訊號處理(signal handler)表

clone_ptrace   若父程序被trace,子程序也被trace

clone_vfork     父程序被掛起,直至子程序釋放虛擬記憶體資源

clone_vm           子程序與父程序執行於相同的記憶體空間

clone_pid          子程序在建立時pid與父程序一致

clone_thread    linux 2.4中增加以支援posix執行緒標準,子程序與父程序共享相同的執行緒群

fork()可以看成是完全版的clone(),而clone()轉殖的只是fork()的一部分。

第二個階段就是所建立程序的執行。子程序建立完後一般都會走自己的路。linux為了子程序能做自己的事特意提供了乙個系統呼叫execve(),用以執行乙個可執行程式的映像,這個映像以檔案形式存在(這句話其實就是說用execve()可以呼叫乙個可執行程式,因為這個可執行程式就在磁碟上,所有是以檔案形式存在的,而映像是說已經編譯鏈結好了的,只要調入記憶體就可以執行,一般為二進位制檔案)。vfork建立的子程序要先於父程序執行,子程序執行時,父程序處於掛起狀態,子程序執行完,喚醒父程序。

Linux程序簡介

在一台伺服器上面看到有如下這麼多類似的程序 2 root 20 0 0 0 0 s 0 0.0 0 00.00 kthreadd 3 root rt 0 0 0 0 s 0 0.0 0 00.00 migration 0 4 root 20 0 0 0 0 s 0 0.0 0 00.09 ksoft...

linux程序簡介

程序是linux重要的一部分,了解linux就必須要去了解程序.程序是linux資源封裝單位,資源指的占用的記憶體,檔案系統,訊號,執行緒是排程執行的單元.linux可以做到程序間的資源隔離.程序的描述就是資源的描述.pcb process control block 是作業系統用來描述程序的,li...

Linux 如何建立程序函式與檢視程序

程序就是pcb,意味著建立乙個程序,就是建立乙個pcb pid t fork void 通過複製呼叫程序 父程序 建立乙個新的程序 子程序 建立乙個新的pcb,然後從父程序pcb中複製了很多資料過來複製的主要資訊有記憶體指標,程式計數器,上下文資料。記憶體指標 子程序與父程序執行的 其實是一樣的 指...