使用新的映象替換舊的映象
載入新的影響使用execve(2)家族的函式
execve(2)
#include
int execve(const
char *filename, char *const argv,char *const envp);
功能:執行程式
引數:filename:指定了要執行的程式(二進位制的可執行的檔案或指令碼)
argv:是傳遞給程式的引數,相當於命令列引數的傳遞
envp:是傳遞給程式的環境變數
返回值: 成功不返回
錯誤返回 -1 errno被設定
舉例:execve的使用,載入新的映象。(execve.c)
#include
#include
#include
#include
#include
int main(void) ; //這裡是傳給main函式第二引數的內容,陣列下標為0指的就是編譯後的可執行程式的名字,後面加null作用是如果遍歷的話,見到null表示結束
char *e_envp = ;//這裡傳遞的是環境變數,當執行被呼叫的程式後,會顯示環境變數,這裡傳遞變數後就將原來的變數全部覆蓋了,所以只顯示一條資訊
//建立乙個子程序
pid_t pid = fork();
if(pid == -1)
if(pid == 0)
else }}
tarena@ubuntu:~/day/day31$ a.out
tarena=gqm
清理完成...255
//這裡的退出碼是程式myenv結束時返回的
execl(3)
#include
extern
char **environ;
int execl(const
char *path, const
char *arg, ...);//例如這裡有l,就需要把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 argv);
int execvp(const
char *file, char *const argv);
int execvpe(const
char *file, char *const argv,char *const envp);
l:需要將argv陣列中的每個元素羅列出來傳給函式
v:傳遞指標陣列的首位址
p:指pash環境變數。如果名字帶p的,到pash指定的路徑下找命令,不帶p的,必須告訴程式可執行檔案的路徑
e:帶e的表示,可以在程式載入的過程中設定環境變數,如果不帶e,代表新的程序預設從父程序繼承環境變數
距離說明在子程序載入新的映像exec_ps.c
#include
#include
#include
#include
#include
int main(void) ;
pid_t pid = fork();
if(pid == -1)
if(pid == 0)
else
}tarena@ubuntu:~/day/day29$ a.out
child pid3857
pid ppid pgrp command(程序號 父程序號 程序組號 程序名)
2950
2566
2950 bash
3856
2950
3856 a.out
3857
3856
3856 ps
補充:在bash下鍵入a.out時發生了什麼:
bash呼叫fork(2)建立子程序,然後使用exec(3)系列的函式將a.out的映像替換掉程序從父程序繼承下來的映像,這也是所有的bash外部命令執行的原理
bash執行環境下,命令分為兩種,內部命令和外部命令
如何察看乙個命令是內部命令還是外部命令
內部命令和外部命令的區別:
內部命令的實現在bash程式中,和bash屬於同乙個程式,在內部命令執行的時候,不需要建立子程序
外部命令就是和bash不是同乙個程式,在外部命令執行的時候,就fork(2) exer(3)
外部命令的執行和bash命令的執行不是同乙個程序,內部命令的執行和bash的執行是同乙個程序
fork(2)exec(3)的配合使用
fork(2)只是建立了程序的空間,但是exec才更新了fork(2)出來的子程序映像
作業:
自己編寫**,實現bash的功能,編譯生成可實行檔案psh
要支援內部命令(cd),和全部外部命令
C語言 unix c 動態載入
動態載入 在程式中根據程式的需要,動態載入某個庫函式,這種行為稱為動態載入,系統為實現動態載入提供了一下函式 man 3 dlopen顯示幫助 標頭檔案 include void dlopen const char filename,int flag 引數 filename 制定了動態庫的檔案名字 ...
C語言 unix c 找到載入器的方法
找到載入器的方法 1 使用環境變數告訴載入器動態庫的搜尋路徑 export ld library path ld library path tmath 取出該變數的值,然後加上tmath後再賦值給變數 把動態庫檔案複製過去 舉例 tarena ubuntu day day24 tmath sudo ...
C語言 unix c 訊號基礎
二 訊號的基礎 1 什麼是訊號 訊號就是 軟中斷 軟中斷就是軟體模擬的中斷機制。2 中斷是什麼 正常的執行流程,訊號處理程式是兩條執行路線,但是屬於同乙個程序 3 系統為我們提供了哪些訊號?kill l 察看系統的中斷 64個訊號,32,33沒有 tarena ubuntu kill l 1 sig...