<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 進(jìn)程控制開(kāi)發(fā)之:Linux進(jìn)程控制編程

進(jìn)程控制開(kāi)發(fā)之:Linux進(jìn)程控制編程

作者: 時(shí)間:2013-09-13 來(lái)源:網(wǎng)絡(luò ) 收藏

本文引用地址:http://dyxdggzs.com/article/257131.htm

(4)使用注意點(diǎn)。

()使用一次就創(chuàng )建一個(gè)進(jìn)程,所以若把()放在了ifelse判斷語(yǔ)句中則要小心,不能多次使用()函數。

小知識

由于fork()完整地復制了父進(jìn)程的整個(gè)地址空間,因此執行速度是比較慢的。為了加快fork()的執行速度,有些UNIX系統設計者創(chuàng )建了vfork()。vfork()也能創(chuàng )建新進(jìn)程,但它不產(chǎn)生父進(jìn)程的副本。它是通過(guò)允許父子進(jìn)程可訪(fǎng)問(wèn)相同物理內存從而偽裝了對進(jìn)程地址空間的真實(shí)拷貝,當子進(jìn)程需要改變內存中數據時(shí)才復制父進(jìn)程。這就是著(zhù)名的“寫(xiě)操作時(shí)復制”(copy-on-write)技術(shù)。

現在很多嵌入式系統的fork()函數調用都采用vfork()函數的實(shí)現方式,實(shí)際上uClinux所有的多進(jìn)程管理都通過(guò)vfork()來(lái)實(shí)現。

2.exec函數族

(1)exec函數族說(shuō)明。

fork()函數是用于創(chuàng )建一個(gè)子進(jìn)程,該子進(jìn)程幾乎復制了父進(jìn)程的全部?jì)热?,但是,這個(gè)新創(chuàng )建的進(jìn)程如何執行呢?這個(gè)exec函數族就提供了一個(gè)在進(jìn)程中啟動(dòng)另一個(gè)程序執行的方法。它可以根據指定的文件名或目錄名找到可執行文件,并用它來(lái)取代原調用進(jìn)程的數據段、代碼段和堆棧段,在執行完之后,原調用進(jìn)程的內容除了進(jìn)程號外,其他全部被新的進(jìn)程替換了。另外,這里的可執行文件既可以是二進(jìn)制文件,也可以是下任何可執行的腳本文件。

中使用exec函數族主要有兩種情況。

n 當進(jìn)程認為自己不能再為系統和用戶(hù)做出任何貢獻時(shí),就可以調用exec函數族中的任意一個(gè)函數讓自己重生。

n 如果一個(gè)進(jìn)程想執行另一個(gè)程序,那么它就可以調用fork()函數新建一個(gè)進(jìn)程,然后調用exec函數族中的任意一個(gè)函數,這樣看起來(lái)就像通過(guò)執行應用程序而產(chǎn)生了一個(gè)新進(jìn)程(這種情況非常普遍)。

(2)exec函數族語(yǔ)法。

實(shí)際上,在Linux中并沒(méi)有exec()函數,而是有6個(gè)以exec開(kāi)頭的函數,它們之間語(yǔ)法有細微差別,本書(shū)在下面會(huì )詳細講解。

下表7.3列舉了exec函數族的6個(gè)成員函數的語(yǔ)法。

表7.3 exec函數族成員函數語(yǔ)法

所需頭文件

#includeunistd.h>

函數原型

intexecl(constchar*path,constchar*arg,...)

intexecv(constchar*path,char*constargv[])

intexecle(constchar*path,constchar*arg,...,char*constenvp[])

intexecve(constchar*path,char*constargv[],char*constenvp[])

intexeclp(constchar*file,constchar*arg,...)

intexecvp(constchar*file,char*constargv[])

函數返回值

-1:出錯

這6個(gè)函數在函數名和使用語(yǔ)法的規則上都有細微的區別,下面就可執行文件查找方式、參數表傳遞方式及環(huán)境變量這幾個(gè)方面進(jìn)行比較。

n 查找方式。

讀者可以注意到,表7.3中的前4個(gè)函數的查找方式都是完整的文件目錄路徑,而最后2個(gè)函數(也就是以p結尾的兩個(gè)函數)可以只給出文件名,系統就會(huì )自動(dòng)按照環(huán)境變量“$PATH”所指定的路徑進(jìn)行查找。

n 參數傳遞方式。

exec函數族的參數傳遞有兩種方式:一種是逐個(gè)列舉的方式,而另一種則是將所有參數整體構造指針數組傳遞。

在這里是以函數名的第5位字母來(lái)區分的,字母為“l”(list)的表示逐個(gè)列舉參數的方式,其語(yǔ)法為char*arg;字母為“v”(vertor)的表示將所有參數整體構造指針數組傳遞,其語(yǔ)法為*constargv[]。讀者可以觀(guān)察execl()、execle()、execlp()的語(yǔ)法與execv()、execve()、execvp()的區別。它們具體的用法在后面的實(shí)例講解中會(huì )具體說(shuō)明。

這里的參數實(shí)際上就是用戶(hù)在使用這個(gè)可執行文件時(shí)所需的全部命令選項字符串(包括該可執行程序命令本身)。要注意的是,這些參數必須以NULL表示結束,如果使用逐個(gè)列舉方式,那么要把它強制轉化成一個(gè)字符指針,否則exec將會(huì )把它解釋為一個(gè)整型參數,如果一個(gè)整型數的長(cháng)度char*的長(cháng)度不同,那么exec函數就會(huì )報錯。

n 環(huán)境變量。

exec函數族可以默認系統的環(huán)境變量,也可以傳入指定的環(huán)境變量。這里以“e”(environment)結尾的兩個(gè)函數execle()和execve()就可以在envp[]中指定當前進(jìn)程所使用的環(huán)境變量。

表7.4是對這4個(gè)函數中函數名和對應語(yǔ)法的小結,主要指出了函數名中每一位所表明的含義,希望讀者結合此表加以記憶。

表7.4 exec函數名對應含義

前4位

統一為:exec

第5位

l:參數傳遞為逐個(gè)列舉方式

execl、execle、execlp

v:參數傳遞為構造指針數組方式

execv、execve、execvp

第6位

e:可傳遞新進(jìn)程環(huán)境變量

execle、execve

p:可執行文件查找方式為文件名

execlp、execvp

(3)exec使用實(shí)例。

下面的第一個(gè)示例說(shuō)明了如何使用文件名的方式來(lái)查找可執行文件,同時(shí)使用參數列表的方式。這里用的函數是execlp()。

/*execlp.c*/

#includeunistd.h>

#includestdio.h>

#includestdlib.h>

intmain()

{

if(fork()==0)

{

/*調用execlp()函數,這里相當于調用了ps-ef命令*/

if((ret=execlp(ps,ps,-ef,NULL))0)

{

printf(Execlperrorn);

}

}

}

在該程序中,首先使用fork()函數創(chuàng )建一個(gè)子進(jìn)程,然后在子進(jìn)程里使用execlp()函數。讀者可以看到,這里的參數列表列出了在shell中使用的命令名和選項。并且當使用文件名進(jìn)行查找時(shí),系統會(huì )在默認的環(huán)境變量PATH中尋找該可執行文件。讀者可將編譯后的結果下載到目標板上,運行結果如下所示:

$./execlp

PIDTTYUidSizeStateCommand

1root1832Sinit

2root0S[keventd]

3root0S[ksoftirqd_CPU0]

4root0S[kswapd]

5root0S[bdflush]

6root0S[kupdated]

7root0S[mtdblockd]

8root0S[khubd]

35root2104S/bin/bash/usr/etc/rc.local

36root2324S/bin/bash

41root1364S/sbin/inetd

53root14260S/Qtopia/qtopia-free-1.7.0/bin/qpe-qws

54root11672Squicklauncher

65root0S[usb-storage-0]

66root0S[scsi_eh_0]

83root2020Rps-ef

$env

……

PATH=/Qtopia/qtopia-free-1.7.0/bin:/usr/bin:/bin:/usr/sbin:/sbin

……

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>