C語言 unix c 載入新的映像

2021-08-07 13:27:13 字數 2549 閱讀 7287

使用新的映象替換舊的映象

載入新的影響使用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...