一、
程序的建立
fork(),
vfork()
兩個函式都可以進行程序的建立,但是卻稍有不同
fork函式建立的子程序是將父程序的資源拷貝乙份
vfork函式建立的子程序是與父程序共享資料空間,而不是單純的拷貝
此外,在呼叫vfork函式的時候,子程序必須要先退出,父程序才能繼續執行 二、
程序的執行
1.execl
函式的作用:
執行乙個檔案,
函式原型: int execl(const char *path, const char *arg,..)
引數說明: path:代表的檔案路徑;
arg: 表示
argv[0], argv[1],...
最後乙個以null結束;
返回值:成功函式沒有返回,出錯-1;
2.execv
函式的作用:
函式原型:int exev(const char *path, char * const argv)
函式的引數: path:代表的檔案路徑;
argv:是乙個陣列裡的指標傳遞過來;
返回值:
成功不返還,出錯-1
注:exec函式族都是與程序執行相關的函式,這裡只列舉了其中兩個,關於
exec
函式組的整理在之前的部落格中有寫到過
3. system
函式的作用:執行乙個命令
函式的原型: int system(const char * string);
三、程序的等待
1.wait
函式的作用:
程序的等待,阻塞程序,等待某個子程序退出;
函式的原型: pid_t wait(int *status);
返回值:成功返回子程序pid,出錯-1;
2.waitpid
函式的作用:等待退出,等待訊號,或者指定的程序結束
函式的原型:pid_t waitpid(pid_t pid , int *status, int options);
函式的引數:
pid <-1 :等待程序的
pid絕對值的任何的子程序;
pid=-1, 任何子程序,
---等於
wait
;pid=0,
pid >0, 等待子程序為
pid的子程序退出
options:
wnohang:如果沒有子程序退出,馬上返回不等待
wuntraced:如果子程序進入暫停執**況,馬上返回,
返回值:如果執行成功返回的是子程序的pid,失敗-1;
如果使用wnohang的時候,沒有子程序退出則返回0。
所以,實際上wait函式是
waitpid
函式的乙個特例。 四、
程序的退出
1.exit
函式的作用:正常結束程序
函式原型: void exit(int status)
_exit()函式和
exit()
函式的區別在於,
exit()
函式在退出後會將
io緩衝區一併清除,而
_exit()
函式並不會這樣 五、
程序相關函式的使用
1.如何新建立乙個程序?
#include
#include
#include
#include
#include
#include
#include
/* 程序建立
*/void main(void)
else if(child==0) // 子程序
while(((child=wait(&status))==-1)&(errno==eintr)); //子程序未結束
if(child==-1)
printf("wait error: %s\n", strerror(errno));
else if(!status) // 子程序退出值為
0printf("child %ld terminated normally return status is zero\n", child);
else if(wifexited(status)) // 子程序退出值
0printf("child %ld terminated normally return status is %d\n", child, wexitstatus(status));
else if(wifsignaled(status)) // 子程序未獲訊號而退出
printf("chlid %ld terminated due to signal %d not caught\n", child, wtermsig(status)); }
2.有哪幾個函式返回的是子程序的pid?
總共有4個函式
①wait
:函式執行成功時返回的是子程序的
pid②waitpid
:執行成功時返回子程序的
pid③fork
:如果返回值
>0
,則返回的是子程序的程序號
④vfork
:同fork 3.
wait函式的使用例項
#include
#include
#include
#include
int main(void)
else
return 0; }
4.waitpid函式的使用例項
#include
#include
#include
#include
#include
void die(const char *msg)
void child2_do()
} void child1_do(pid_t child2, char *argv)
else
if (pw == 0)
}while (pw == 0);
if (pw == child2) }
else }
void father_do(pid_t child1, char *argv)
else
if (pw == 0)
}while (pw == 0);
if (pw == child1) }
else }
int main(int argc, char *argv)
child1 = fork();
if (child1 < 0)
else if (child1 == 0)
else if (child2 == 0)
else }
else
return 0; }
linux c 程序學習
1.fork 由於fork後的父程序與子程序的優先順序是一樣的,所以會存在父程序已經退出了而子程序還在執行,這時候的子程序就是孤兒程序,會被init程序收養,所以這時候getppid得到的1。int main exit 0 2.vfork 由vfork也是用來建立程序,但是子程序是共享父程序的位址空...
Linux C 學習筆記
1.linux 程序與訊號 檢視當前系統所有程序的shell命令 ps aux 檢視程序樹 pstree 檢視當前使用者啟動的程序 ps af kill 程序號 kill 9 程序號 強行殺死程序 killall 程序名字 如果乙個程序的父程序被殺死 則init就程式設計當前程序的父程序 了解實時作...
linux c語言學習筆記之守護程序
守護程序 概述 守護程序 daemon 是生存期長的一種程序。它們常常在系統引導裝入時起動,在系統關閉時終止。因為它們沒有控制終端,所以說它們是在後台執行的。linux 系 統有很多守護程序,它們執行日常事物活動。所有守護程序都以超級使用者 使用者i d 為0 的優先權執行。沒有乙個守護程序具有控制...