Linux系統程序控制 exec函式族的使用

2021-09-30 04:09:34 字數 2828 閱讀 5831

exec函式可以把當前程序替換為乙個新程序,新程序由path或file指定,可以使用exec函式將程式的執行從乙個程式切換到另乙個程式,新的程式啟動後,原來的程式就不再執行。

#include

char **environ;

int execl(const char *path, const char *arg0, ..., (char *)0);

int execlp(const char *file, const char *arg0, ..., (char *)0);

int execle(const char *path, const char *arg0, ..., (char *)0, char *const envp);

int execv(const char *path, char *const ar**);

int execvp(const char *file, char *const ar**);

int execve(const char *path, char *const ar**,char *const envp);

這些函式分為兩大類,execl,execlp和execle的引數個數是可變的,引數以乙個空指標結束。

execv和execvp的第二個引數是字串陣列,兩者在新程式啟動時都會把在ar**陣列中給定的引數傳遞給main函式。

上面的5個函式通常都是由execve函式實現。

以字母p結尾的函式通過搜尋path環境變數來查詢新程式的可執行檔案的路徑,如果可執行檔案不在path定義的路徑中,則需要把包括目錄在內的使用絕對路徑的檔名作為引數傳遞給函式。

函式execle和execve可以通過引數envp傳遞字串陣列作為新程式的環境變數。

下面是乙個示例程式:

#include

#include

#include

int main()

儲存為pexec.c

編譯:gcc -o pexec pexec.c

然後執行:./pexec

在筆者電腦上得到如下結果:

running ps  with execl

總計 36

-rwxr-xr-x 1 deng deng 8371 2010-08-13 21:06 pexec

-rw-r--r-- 1 deng deng  177 2010-08-13 20:11 pexec.c

-rw-r--r-- 1 deng deng  170 2010-08-13 07:54 pexec.c~

-rwxr-xr-x 1 deng deng 8374 2010-08-13 07:35 system1

-rw-r--r-- 1 deng deng  143 2010-08-13 07:35 system1.c

以上是正常的ls命令的輸出結果,但字串done卻根本沒出現,說明當前程式已經被execl函式替換掉了。

另乙個示例:

#include

#include

#include

int main()

該示例程式用於列印當前的程序,儲存為pexecp.c

編譯:gcc -o pexecp pexecp.c

執行:./pexecp

筆者電腦執行的結果如下:

running ps  with execlp

pid tty      stat   time command

1 ?        ss     0:00 /sbin/init

2 ?        s<     0:00 [kthreadd]

3 ?        s<     0:00 [migration/0]

4 ?        s<     0:00 [ksoftirqd/0]

5 ?        s<     0:00 [watchdog/0]

6 ?        s<     0:00 [migration/1]

7 ?        s<     0:00 [ksoftirqd/1]

8 ?        s<     0:00 [watchdog/1]

9 ?        s<     0:00 [events/0]

10 ?        s<     0:00 [events/1]

11 ?        s<     0:00 [cpuset]

12 ?        s<     0:00 [khelper]

………………中間還有很多,在此省略

4698 ?        sl     2:48 /usr/lib/firefox-3.6.8/plugin-container /usr/lib/flas

4787 ?        s      0:01 gedit /home/deng/workspace/linux_test/chapter11/pexec

4975 ?        s      0:00 /usr/lib/**fs/**fsd-computer --spawner :1.9 /org/gtk/

4997 ?        rl     0:00 gnome-terminal

4998 ?        s      0:00 gnome-pty-helper

4999 pts/0    ss     0:00 bash

5106 pts/0    r+     0:00 ps ax

在這裡可以看到我們在程式裡面用execlp()函式啟動的程序ps ax,它相當於shell下的命令ps ax,效果相同

但這裡我們依然沒有看到最後一句done沒有被列印出來

一般情況下,exec函式是不會返回的,除非發生了錯誤。出現錯誤時,exec函式會返回-1,並且會設定錯誤變數errno.

linux程序控制 exec系列

說是exec系統呼叫,實際上在linux中,並不存在乙個exec 的函式形式,exec指的是一組函式,一共有6個,分別是 include int execl const char path,const char arg,int execlp const char file,const char ar...

Linux程序控制(二)exec

4.執行另乙個程式 exec系列函式 子程序經常要呼叫exec函式執行另乙個程式,程序id不變,exec系列函式有7種 include int execl const char pathname,const char arg0,int execv const char pathname,char c...

Linux程序控制 exec函式族

1 簡介 在linux中,並不存在exec 函式,exec指的是一組函式,一共有6個,分別是 include extern char environ int execl const char path,const char arg,int execlp const char file,const c...