linux啟動新程序

2021-07-05 20:20:01 字數 3287 閱讀 3639



說到程序,首先要明確的乙個概念就是什麼是程序,程序是「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 ...