我們都知道,程序就是正在執行的程式。而在linux中,可以使用乙個程序來建立另外乙個程序。這樣的話,linux的程序的組織結構其實有點像linux目錄樹,是個層次結構的,可以使用pstree命令來檢視。在最上面是init程式的執行程序。它是所有程序的老祖宗。linux提供了兩個函式來建立程序。
1.fork()
fork()提供了建立程序的基本操作,可以說它是linux系統多工的基礎。該函式在unistd.h庫中宣告。
view source
print?
#include
#include
#include
int
main()
else
if
( pid>0 )
else
return
1;
}
在呼叫fork()之前,只有乙個程序,但是fork()之後,將產生乙個該程序的子程序,該子程序完全複製父程序,此時父子兩個程序同時執行。在fork()的時候,如果返回的是0,則說明該程序是子程序。如果返回大於0則說明是父程序。如果小於0(其實是-1),則說明建立程序失敗了。
每個程序都有乙個唯一標示符,即pid,可以使用getpid()來獲取。父程序返回的pid其實是子程序的pid。
貌似這樣看,fork()之後也沒有什麼作用。其實不然,如果fork()之後跟其他linux功能使用,還是用處很大的。比如我們可以在父子程序中通過通訊協議來通訊,就可以協同完成一些任務了。
2.exec系列函式
如果只有fork(),肯定是不完美的,因為fork()只能引數乙個父程序的副本。而exec系列函式則可以幫助我們建立乙個全新的新程序。
view source
print?
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
argv);
int
execvp(
const
char
*file,
char
*
const
argv);
以上函式在unistd.h宣告。
下面我們以execl()函式為例:
view source
print?
#include
#include
int
main()
該程式執行到execle()時,載入ls程式,並且覆蓋當前程式的空間。這樣就引數了乙個新的程序,但是注意,這個新程序的pid跟載入它的程序是一樣的。
3.fork()和exec()一起呼叫
fork()可以建立子程序,但是子程序只是父程序的副本。我們可以利用exec()函式在子程序來重新載入乙個全新的程序。下面看乙個兩個函式聯用的列子。
view source
print?
#include
#include
#include
int
main()
}
首先,fork建立子程序,然後在子程序中使用execl()產生乙個ls程式的程序。而父程序則呼叫wait()來等待,直到子程序呼叫結束。
Linux下程序的建立
我們都知道,程序就是正在執行的程式。而在linux中,可以使用乙個程序來建立另外乙個程序。這樣的話,linux的程序的組織結構其實有點像linux目錄樹,是個層次結構的,可以使用pstree命令來檢視。在最上面是init程式的執行程序。它是所有程序的老祖宗。linux提供了兩個函式來建立程序。1.f...
Linux 下,如何建立守護程序
最近在看apue,記錄一下如何建立乙個完整的守護程序。以備不時檢視。注 redhat在 var log messages檔案中,可檢視syslog函式記錄的日誌。cpp view plain copy include include include include include include i...
Linux下 程序簡單建立vfork
上文,簡單得介紹了fork。這裡,我們來說一下vfork fork和vfork的區別 1.記憶體空間 fork 子程序拷貝父程序的資料段,段 vfork 子程序與父程序共享資料段 2.執行次序 fork 父 子程序的執行次序不確定 vfork 子程序先執行,在呼叫exec 或exit 之前與父程序資...