Linux 呼叫可執行程式

2021-10-25 21:15:39 字數 3681 閱讀 3024

3.使用execl 常用方法

二、system函式

在c/c++程式中,經常需要呼叫其它的程式來先成某項任務,例如其它的c/c++程式、作業系統命令或shell指令碼,c/c++提供了exec函式族和system函式來實現這個功能。

exec函式族提供了乙個在程序中啟動另乙個程式執行的方法。它可以根據指定的檔名或目錄名找到可執行檔案,並用它來取代原呼叫程序的資料段、**段和堆疊段,在執行完之後,原呼叫程序的內容除了程序號外,其他全部被新的程序替換了。還有,這裡的可執行檔案既可以是二進位制檔案,也可以是linux下任何可執行的指令碼檔案。

exec函式族的宣告如下:

int

execl

(const

char

*path,

const

char

*arg,..

.);int

execlp

(const

char

*file,

const

char

*arg,..

.);int

execle

(const

char

*path,

const

char

*arg,..

.,char

*const envp)

;int

execv

(const

char

*path,

char

*const ar**)

;int

execvp

(const

char

*file,

char

*const ar**)

;int

execvpe

(const

char

*file,

char

*const ar**,

char

*const envp)

;

path:要執行的程式路徑。 可以是絕對路徑或者是相對路徑。在execv、execl和execle這三個函式中,使用帶路徑名的檔名作為引數。

file:要執行的程式名稱。 如果該引數中包含「/」字元,則視為路徑名直接執行;否則視為單獨的檔名,系統將根據path環境變數指定的路徑順序搜尋指定的檔案。

ar**:命令列引數的陣列。

envp:帶有該引數的exec函式可以在呼叫時指定乙個環境變數陣列。 其他不帶該引數的exec函式則使用呼叫者程序的環境變數。

arg:程式的第0個引數,即程式名自身。相當於ar**[0]。

…:命令列引數列表。 呼叫相應程式時有多少命令列引數,就需要有多少個輸入引數項。注意:在使用此類函式時,在所有命令列引數的最後應該增加乙個空的引數項(null),表明命令列引數結束。

如果執行失敗則直接返回-1,失敗原因存於errno 中。

如果執行成功則函式不會返回,這句話可能難以理解,當在主程式中成功呼叫execl後,被呼叫的程式將取代呼叫者程式,也就是說,execl函式之後的**都不會被執行。

最常用的是execl函式,其它的極少使用

示例(book266.cpp)

/*

* 程式名:book266.cpp,此程式用於演示用execl函式執行程式。

*/#include

#include

#include

#include

intmain()

我們先測試執行失敗的情況,啟用以下**。

int iret=

execl

("/bin/lss"

,"/bin/ls"

,"-l"

,"/usr/include/stdio.h",0

);// /bin/lss不存在,執行不能成功。

執行效果

再測試執行成功的情況,啟用以下**。

int iret=

execl

("/bin/ls"

,"/bin/ls"

,"-l"

,"/usr/include/stdio.h",0

);// 可以呼叫成功的**。

執行效果

從book266執行的結果可以看出,主程式中成功呼叫execl後,execl函式之後的**都不會被執行。 後面的列印內容就沒有列印出來了。

(1)修改**,填寫程式的路徑、名稱,所需要的引數

這個程式的路徑為:/root/多程序c++封裝客戶端

可執行程式名為:/root/多程序c++封裝客戶端

需要的引數有兩個:乙個是服務端的ip位址,乙個是埠

(2)先啟動服務端程式,在啟動這個測試程式,發現能呼叫客戶端程式。

通常會用fork(),讓子程序去呼叫別的可執行程式,父程序會去執行其他的事情。

system函式提供了另一種簡單的執行程式的方法,把需要執行的命令用乙個引數傳給system函式。

system函式的宣告如下:

int

system

(const

char

* string)

;

system會呼叫fork產生子程序,由子程序來呼叫/bin/sh -c string來執行引數string字串所代表的命令,此命令執行完後隨即返回原呼叫的程序。在呼叫system期間sigchld訊號會被暫時擱置,sigint和sigquit 訊號則會被忽略。

如果fork失敗 返回-1,出現錯誤。

如果execl失敗,表示不能執行shell,返回值相當於shell執行了exit(127)。

如果執行成功則返回子shell的終止狀態。

如果system在呼叫/bin/sh時失敗則返回127,其他失敗原因返回-1。若引數string為空指標(null),僅當命令處理程式可用時,返回非零值。如果system呼叫成功則最後會返回執行shell命令後的返回值,但是此返回值也有可能為system呼叫/bin/sh失敗所返回的127,因此最好能再檢查errno 來確認執行成功。

示例(book269.cpp)

/*

* 程式名:book269.cpp,此程式用於演示用system函式執行程式。

*/#include

#include

#include

#include

intmain()

執行效果

VC 呼叫外部可執行程式

方法一 winexec notepad.exe,sw show 方法二 shellexecute null,open notepad.exe null,null,sw showmaximized 方法三 startupinfo si zeromemory si,sizeof startupinfo ...

VC 呼叫外部可執行程式

方法一 winexec notepad.exe,sw show 方法二 shellexecute null,open notepad.exe null,null,sw showmaximized 方法三 startupinfo si zeromemory si,sizeof startupinfo ...

建立linux可執行程式

1.在vendor rockchip目錄下建立工程目錄loopread 2.目錄結構如下 loopread.mk sepolicy file contexts loopread.te src android.mk etc init.loopread.rc loopread.c3.下面逐步解讀工程檔案...