在linux系統中,對於程序進行控制的主要系統呼叫以下所示
1.fork函式函式宣告
#include
#include
pid_t fork(void);
以下這段話是從別人的部落格中看到的,我覺得很不錯,較為詳細地剖析了兩次返回的實質
對於fork來說,父子程序共享同一段**空間,所以給人的感覺好像是有兩次返回,其實對於呼叫fork
的父程序來說,如果fork出來的子程序沒 有得到 排程,那麼父程序從fork系統呼叫返回,同時分析sys_fork知道
,fork返回的是子程序的id。再看fork出來的子程序,由 copy_process函式可以看出,子程序的返回位址為ret_from_fork(和父程序在同乙個**點上返回),返回值直接置為0。所以當子進 程得到排程的時候,
也從fork返回,返回值為0。關鍵注意兩點:1.fork返回後,父程序或子程序的執行位置。(首先會將當
前程序eax的值做為返回值)2.兩次返回的pid存放的位置。(eax中)
程序呼叫copy_process得到lastpid的值(放入eax中,fork正常返回後,父程序中返回的就是lastpid)
子程序任務狀態段tss的eax被設定成0,fork.c 中p->tss.eax=0;(如果子程序要執行就需要程序切換,
當發生切換時,子程序tss中的eax值就調入eax暫存器,子程序執行時首先會將eax的內容做為返回值)
當子程序開始執行時,copy_process返回eax的值。
fork()後,就是兩個任務同時進行,父程序用他的tss,子程序用自己的tss,在切換時,各用各的eax中的值.
所以,「一次呼叫兩次返回」是2個不同的程序!
2.exec函式族
#include
int execl(const
char *path, const
char *arg, ...)
int execv(const
char *path, char *const argv)
int execle(const
char *path, const
char *arg, ..., char *const envp)
int execve(const
char *path, char *const argv, char *const envp)
int execlp(const
char *file, const
char *arg, ...)
int execvp(const
char *file, char *const argv)
使用fork或vfork函式建立子程序後,子程序通常會呼叫exec函式來執行另外乙個程式。系統呼叫exec用於執行乙個可執行程式以代替當前程序的執行映像
注意:exec呼叫並沒有生成新程序。乙個程序一旦呼叫exec函式。它本身就「死亡了」,系統把**段替換成新的程式的**,廢棄原有的資料段和堆疊段。並為新程式分配新的資料段與堆疊段,唯一保留的就是程序id,也就是說,對系統而言,還是同乙個程序,不過執行的已經是另外乙個程式了。
具體的函式說明見man exec中對整個exec族函式的詳細解釋。
3.wait/waitpid函式
函式原型
#include
#include
pid_t wait(int *statloc);
pid_t waitpid(pid_t pid,int *statloc,int options);
如果子程序先於父程序退出時,如果父程序沒有呼叫wait和waitpid函式,子程序就會進入僵死狀態。如果父程序呼叫了wait或waitpid函式,就不會使子程序變成殭屍程序。
wait函式使父程序暫停執行,直到它的第乙個子程序結束為止。該函式的返回值是終止執行的子程序pid。引數statloc所指向的變數存放子程序的退出碼。即從子程序的main函式返回的值或子程序中exit函式的引數。
4.gitpid函式
#include
#inlcude
pid_t getpid(void);
系統呼叫getpid獲取當前程序的id。
man手冊中的部分描述
getpid() returns the process id (pid) of the calling process. (this is often used by rou‐
tines that generate unique temporary filenames.)
程序控制相關的幾個函式
通常,建立新的程序,都是為了立即執行新的 不同的程式。所以一般都是fork 系統呼叫建立新程序,然後使用exec 系統呼叫函式組,來建立新的位址空間,把新的程式載入進去。最終,通過exit 系統呼叫退出程序,這個函式會終結程序,並釋放該程序占用的資源。父程序可以通過wait 系統呼叫,檢視子程序是否...
函式部分相關練習題及解答
1 寫函式,計算傳入字串中 數字 字母 空格 以及 其他 的個數 分析 需要計算 數字 等的個數,需首先判斷該元素是不是數字或字母,需要呼叫元素屬性判斷,例子如下 1 str1 dadsddsfd 6 reerere0r089eeffefdfd ewrer 2 defst string 3 all ...
程序控制之exec函式
1.exec函式 include int execl const char pathname,const char arg0,char 0 int execv const char pathname,const char argv int execle const char pathname,con...