說到程序,首先要明確的乙個概念就是什麼是程序,程序是「a program in execution」。乙個程序由如下元素組成:
–程式的上下文(context),它是程式當前執行的狀態
–程式的當前執行目錄
–程式訪問的檔案和目錄
–程式的信任狀態或者說訪問許可權,比如它的檔案模式和所有權
–記憶體和其他分配給程序的系統資源
本文討論建立程序 1、
system庫函式
在標頭檔案#include中包含
函式原型:int system(const char *command);
功能描述:system()通過呼叫/bin/sh –c command來執行具體的command命令,在command完成後返回。在command執行期間,sigchld訊號被阻塞,sigint和sigquit將被忽略。
返回值: 如果沒有找到/bin/sh,system返回127;
如果出現其他錯誤則返回-1;
如果執行成功則返回command的**。
但是如果command為null,system返回乙個非0值,否則返回0。
示例:\
#include
#include
int main()
2、 fork系統呼叫
fork呼叫建立乙個新的程序。新的程序或者說子程序是呼叫程序的或者說父程序的副本。
fork的語法是
#include
pid_t fork(void);
如果fork執行成功,就向父程序返回子程序的pid,並向子程序返回0。這就一起這即使你只呼叫fork一次,他也會返回兩次。
fork建立的新程序是和父程序(除了pid和ppid)一樣的副本,包括真實和有效的uid和gid、程序組合會話id、環境、資源限制、開啟的檔案以及共享記憶體段。
父程序和子程序之間有一點區別。子程序沒有繼承父程序的超市設定(使用alarm呼叫
)父程序建立的檔案鎖,或者未決訊號。要理解的關鍵概念是fork建立的新程序是父程序的乙個準確副本。
2、fork系統呼叫
fork呼叫建立乙個新的程序。新的程序或者說子程序是呼叫程序的或者說父程序的副本。
fork的語法是
#include
pid_t fork(void);
如果fork執行成功,就向父程序返回子程序的pid,並向子程序返回0。這就一起這即使你只呼叫fork一次,他也會返回兩次。
fork建立的新程序是和父程序(除了pid和ppid)一樣的副本,包括真實和有效的uid和gid、程序組合會話id、環境、資源限制、開啟的檔案以及共享記憶體段。
父程序和子程序之間有一點區別。子程序沒有繼承父程序的超時設定(使用alarm呼叫)父程序建立的檔案鎖,或者未決訊號。要理解的關鍵概念是fork建立的新程序是父程序的乙個準確副本。
示例:[cpp]view plain
copy
print?
"font-size: 14px;">#include
#include
#include
#include
int main(void)
else
if(child == 0) //子程序中
else
exit(exit_success);
}
#include#include#include#includeint main(void)
else if(child == 0) //子程序中
else
exit(exit_success);
}
3、
exec函式族
與fork函式一樣,exec也在中宣告。它的原型為:
int execl(const char *path, const char*arg, ...(char *) 0);//以0結尾
int execlp(const char *file, const char*arg, ...(char *) 0);
int execle(const char *path, const char*arg , ...,(char *) 0, char * const envp);
int execv(const char *path, char *const argv);
int execvp(const char *file, char *const argv);
int execve(const char *path, char *const argv, char *const envp);
exec用被執行的程式完全替換了呼叫程序的映像。fork建立了乙個新程序就產生了乙個新的pid,exec啟動乙個新程式,替換原有程序。因此被執行的程序的pid不會改變。
例如:int execve(const char *path, char *constargv, char *const envp);
接收三個引數:
path是要執行的二進位制檔案或指令碼的完整路徑。
argv是要傳遞給程式的完整引數列表,包括argv[0],它一般是執行程式的名字,
envp是指向用於執行execed程式的專門環境的指標。
這幾個函式可以簡單討論如下:
名字中含有l的函式:希望接受以逗號分隔的引數列表,列表以null指標作為結束標誌,這些引數將傳遞給被執行的程式。
名字中包v的函式:則接受乙個向量,也就是以空結尾的字串的指標陣列。這個陣列必須以乙個null指標作為結束標誌。
不過,需要注意的是,有時候可能那個null,需要寫成(char *)0。
[cpp]view plain
copy
print?
"font-size: 14px;">//乙個建立num個程序的示例:
//其中batchscript是已經寫好的shell指令碼檔案。
void createsubprocess(int num)
else
if(child==0) //子程序執行
} else
} for(i=0;i
}
//乙個建立num個程序的示例:
//其中batchscript是已經寫好的shell指令碼檔案。
void createsubprocess(int num)
{ int i;
int child;
int pid[num];
for(i=0;i
實現了多程序併發。
Linux建立新程序
在linux系統中,建立新程序涉及到兩個系統呼叫api 分別是fork 和exec 首先,在當前程序中,呼叫fork 複製出自身的乙個拷貝,此時主要涉及到核心中與程序上下文相關的資料複製操作,而使用者 和資料則採用寫時複製技術共享同乙份資源。當乙個程序複製後,原程序稱為父程序,新程序則稱為子程序.然...
Linux基礎 建立新程序
好久沒學習了,最近都在忙著上班的事情,過年後這段時間感覺每天都有事情做,忙忙忙,學linux感覺說實話,有點枯燥,比當初學fpga還要枯燥。真的是畢業之後,再去學習的動力就下降很多嗎。但是還是要堅持啊。程式並不能單獨執行,只有將程式載入到記憶體中,系統為他分配資源後才能夠執行,這種執行著的程式稱之為...
Linux 中的新程序狀態
linux kernel 2.6.25 引入了一種新的程序狀態,名為task killable,用於將程序置為睡眠狀態,它可以替代有效但可能無法終止的task uninterruptible程序狀態,以及易於喚醒但更加安全的task interruptible程序狀態。2002 年,openafs ...