Linux中的system()函式工作原理

2021-08-10 04:07:27 字數 1001 閱讀 6073

一、linux中的system()函式源**

#include #include #include #include int system(const char * cmdstring)

if((pid = fork())<0)

else if(pid = 0)

else}}

return status;

}

當system接受的命令為null時直接返回,否則fork出乙個子程序,因為fork在兩個程序:父程序和子程序中都返回,這裡要檢查返回的pid,fork在子程序中返回0,在父程序中返回子程序的pid,父程序使用waitpid等待子程序結束,子程序則是呼叫execl來啟動乙個程式代替自己,execl("/bin/sh", "sh", "-c", cmdstring, (char*)0)是呼叫shell,這個shell的路徑是/bin/sh,後面的字串都是引數,然後子程序就變成了乙個shell程序,這個shell的引數是cmdstring,就是system接受的引數。在windows中的shell是command,想必大家很熟悉shell接受命令之後做的事了

二、fork函式的使用

在unix/linux中用fork函式建立乙個新的程序。程序是由當前已有程序呼叫fork函式建立,分叉的程序叫子程序,建立者叫父程序。該函式的特點是呼叫一次,返回兩次,一次是在父程序,一次是在子程序。兩次返回的區別是子程序的返回值為0,父程序的返回值是新子程序的id。子程序與父程序繼續併發執行。如果父程序繼續建立更多的子程序,子程序之間是兄弟關係,同樣子程序也可以建立自己的子程序,這樣可以建立起定義關係的程序之間的一種層次關係。

程式包含位於記憶體的多個組成部分,執行程式的過程將根據需要來訪問這些內容,包括文字段(text segment)、資料段(data segments)、棧(stack)和堆(heap)。文字段中存放cpu所執行的命令,資料段存放程序操作的所有資料變數,棧存放自動變數和函式資料,堆存放動態記憶體分配情況資料。當程序被建立時,子程序收到父程序的資料副本,包括資料空間、堆、棧和程序描述符

LINUX中system()函式詳解

相關函式 fork,execve,waitpid,popen 表頭檔案 include 定義函式 int system const char string 函式說明 system 會呼叫fork 產生子程序,由子程序來呼叫 bin sh c string來執行引數string字串所代表的命令,此命 ...

linux中system和exec函式的區別

system 是用shell來呼叫程式 fork exec waitpid,而exec是直接讓你的程式代替用來的程式執行。system 是在單獨的程序中執行命令,完了還會回到你的程式中。而exec函式是直接在你的程序中執行新的程式,新的程式會把你的程式覆蓋,除非呼叫出錯,否則你再也回不到exec後面...

linux的system 函式詳解

linux的system 函式詳解 system 執行shell 命令 相關函式 fork,execve,waitpid,popen 表頭檔案 i nclude 定義函式 int system const char string 函式說明 system 會呼叫fork 產生子程序,由子程序來呼叫 b...