linux程序程式設計 子程序建立及執行函式簡介

2022-04-02 16:22:45 字數 1996 閱讀 2477

linux程序程式設計:子程序建立及執行函式簡介

子程序建立及執行函式有三個:

(1)fork();

(2)exec();

(3)system();

下面分別做詳細介紹。

(1)fork()

函式定義:

pid_t fork();

函式說明:

linux下程序在記憶體中由三部分資料組成:**段、資料段、堆疊段。在乙個程序中,呼叫fork函式,可以建立、啟動乙個新程序。新程序與父程序共享**段,複製父程序的資料段和堆疊段。建立成功後,fork()會向兩個程序都有返回值。向父程序的返回值為子程序的進行號,向子程序的返回值為0。由於兩個程序共享**段,我們就利用兩個返回值的不同,通過if...else...區分兩程序在子程序啟動後的運**況。

返回值:

建立成功後,fork()會向兩個程序都有返回值。向父程序的返回值為子程序的進行號,向子程序的返回值為0。函式呼叫失敗返回值為-1。錯誤原因存在於errno中。

(2)exec()函式族

exec函式族共6個函式,函式原型:

int execl(const char *path, const char *arg, ...);

int execlp(const char *file, const char *arg, ...);

int execle(const char *path, const char *arg, ..., char *const envp);

int execv(const char *path, char *const arg);

int execvp(const char *file, char *const arg);

int execve(const char *path, char *const arg, char *const envp);

函式族說明:

exec()函式族通過指定路徑或檔名的方式找到並執行乙個可執行檔案。該可執行檔案可以使二進位制檔案或linux系統下可執行的shell指令碼檔案,一旦執行即替代原程序**,廢除原程序資料段和堆疊段,但仍然沿用原程序的程序號。換句話說,原程序執行的程式已經換成了新的程式,但對系統而言還是同乙個程序。如果我們的程式向啟動另乙個程式的執行,還想原程序繼續執行,可以將fork和exec結合使用,先建立新程序,然後再新程序中使用exec呼叫需要啟動的程式。

函式返回值:

exec()函式族的函式執行成功後沒有返回值,呼叫失敗時才會返回-1,原程式由呼叫點繼續往下執行。

(3)system()

函式定義:

int system(const char *file);

函式說明:

system()相當於fork與execl的組合。首先由fork()函式建立了乙個子程序,然後由execl()函式根據引數file給定的檔名找到並執行可執行檔案。

system()與exec函式族都可執行程序外的命令,區別是system()函式在原程式上建立乙個新的程序,再在新程序中執行可執行檔案;而exec函式族是在新開闢的程序中植入新**替代原程式**。

函式返回值:

函式呼叫成功返回0;呼叫失敗返回-1。若返回值的8~15位為127,則system()中的execl函式執行失敗。

以上轉至:

linux程序程式設計:子程序建立及執行函式簡介

最後補充一下,如果用fork複製程序,那麼在複製程序後呼叫的程式/應用內部一定要記得exit(0);做退出處理,不然會出現殭屍程序。

而且你會發現哪怕你在被呼叫的程式/應用a裡面有做exit處理,下次繼續fork()得到的gid會依次遞增,不會復用上乙個pid,為什麼呢?

別著急,這是快取機制,程序一旦退出,程序號可以重用的,但是為了避免誤認為是之前退出的程序,會有一定的延遲,不用擔心程序id被你消耗完。

所以,放心,會重複利用的。一直加,加到最大,在重小的開始,又來一輪。

也可以參考下這篇文章:linux多執行緒概述

Linux 程序 父程序 子程序

程序和程式的區別 一 程序是動態的,程式是靜態的 程式是有序 的集合,程序是程式的執行。程序有核心態 使用者態。二 程序是暫時的,程式是永久的 程序是乙個狀態變化的過程,程式可以長久儲存 三 程序和程式的組成不同,程序的組成包括程式 資料和程序控制塊 即程序狀態資訊 什麼是程序識別符號什麼是父程序和...

Linux程式設計 程序的建立

1.系統呼叫fork 允許乙個程序 父程序 建立一新程序 子程序 具體做法是 新的子程序幾乎是父程序的翻版,子程序獲得了父程序的棧 資料段 堆和執行文字段的拷貝。可視作將父程序一分為二,術語fork由此得名。fork 無需引數 2.庫函式exit status 終止乙個程序,將程序占用的所有資源 記...

linux 守護程序詳解及建立守護程序

linux 守護程序詳解及建立守護程序 守護程序是一種後台執行並且獨立於所有終端控制之外的程序。守護程序的啟動 要啟動乙個守護程序,可以採取一下幾種方式 守護程序的建立 先來看乙個守護程序建立的例子 include include include include define maxfd 64 vo...