




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第第頁Linux如何獲取進程的基地信息
1.問題
執行程序時,與程序同目錄下存在一config/目錄,其中存放了json格式的配置文件。進行部署時需要將程序和config/目錄放在同一位置。那么,問題來了,如何保證不管這個程序部署到什么位置,不管以什么方式運行,程序自己都能訪問到配置文件呢?
解決問題之前,先說一下進程的工作目錄——CurrentW(or)kingDirectory。
2.什么是進程的工作目錄
進程的工作目錄是指進程的調用者在啟動進程對應的程序時,調用者所在的目錄。比如說,在/home/(sd)c/目錄下有一個可執行程序hello-world。如果在根目錄下啟動hello-world,那么hello-world進程的工作目錄為根目錄/。如果在/home/sdc目錄下啟動hello-world,那么其工作目錄為/home/sdc。
(Linux)C中,有兩個函數可以獲取進程工作目錄:getcwd()和re(ad)link()。
2.1getcwd()man3getcwd():/linux/mans/man2/getcwd.2.html
#includechar*getcwd(char*buf,size_tsize);該函數將獲取到的進程工作目錄的絕對路徑存儲在形參buf中。同時也會返回一個指針,指針指向的內容和buf存儲的內容相同。如果路徑的長度比size大,那么該函數返回為NULL。
2.2readlink()man2readlink:/linux/mans/man2/readlink.2.html
#includessize_treadlink(constchar*pathname,char*buf,size_tbufsiz);該函數用于獲取符號鏈接所指的文件。借助/proc/self/cwd,即pathname="/proc/self/cwd",readlink()即可獲得當前進程的工作目錄。
該函數同樣將進程工作目錄的絕對路徑存儲在形參buf中,并返回存儲的路徑長度。但是,buf中存儲路徑不帶字符串結束符'?'。而且,如果返回的長度和bufsiz相同,那么路徑信息很可能被截取了。
2.3簡單例程hello-world.c:
#include#include#include#includeintmain(intargc,char*argv[]){charwork_dir[64]={0};intdir_size=0;getcwd(work_dir,sizeof(work_dir)))printf("getcwd:%sn",work_dir);(mems)et(work_dir,0,sizeof(work_dir));dir_size=readlink("/proc/self/cwd",work_dir,sizeof(work_dir));work_dir[dir_size]='?';printf("readlink:%sn",work_dir);return0;}執行結果:
3.獲取進程對應程序的絕對路徑
如果想要解決文章開頭提出的問題,那么進程需要獲取程序所在的絕對路徑。該功能通過readlink(constchar*pathname,char*buf,size_tbufsiz)實現。不過pathname不再是/proc/self/cwd,而是/proc/self/exe。
開箱即用代碼:
#include#include#include#include#include#include#defineCONFIG_FILENAME"./config/psl.json"http://getcurrentprocesselfabsolu(te)pathstat(ic)int32_tcurr_elf_abs_path_get(int8_t*path_buf,int32_tbuf_size){ssize_tlen=0;int32_ti=0;len=readlink("/proc/self/exe",path_buf,buf_size);if(-1==len){perror("readlinkn");return-1;}if(len==buf_size){printf("Warn:pathmaybetruncatedn");}//fromlasttohead,findfi(rs)t'/'for(i=len;i>0;i--){if(path_buf[i]=='/'){path_buf[i+1]='?';break;}}return0;}intmain(intargc,char*argv[]){int8_telf_path[128]={0};int8_tconfig_file_path[256]={0};intfd=-1;int32_ti=0;int32_tret=0;ret=curr_elf_abs_path_get(elf_path,sizeof(elf_path));if(0!=ret){printf("getexepathfai(led)n");return-1;}printf("currentprocessexeabsolutepath:%sn",elf_path);sprin(tf)(config_file_path,"%s%s",elf_path,CONFIG_FILENAME);fd=open(config_file_path,O_RDWR);if(-1==fd){perror("open");return-1;}printf("open%ssuccessn",config_file_path);close(fd);return0;}CMakeLists.txt:
cmake_minimum_required(VERSION3.12)project(exe-abs-pathC)set(CMAKE_VERBOSE_MAKEFILEON)add_executable(${PROJECT_NAME}main.c)執行結果:
4.總結
我當然可以借助shell腳本解決該問題。可是,我還是喜歡讓程序自己”實現“該功能,這樣我在部署和使用時會方便很多。
5.說明
/proc/self/目錄中存放了當前進程的很多有用信息。
/proc/self/fd/:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 貴州省考試院2025年4月高三年級適應性考試歷史試題及答案
- 汽車液力變矩器項目風險分析和評估報告
- 廣州新華學院《勘技專外語》2023-2024學年第二學期期末試卷
- 四川財經職業學院《中國現當代文學(3)》2023-2024學年第二學期期末試卷
- 山東省青島市市北區達標名校2025屆中考英語試題命題比賽模擬試卷(7)含答案
- 濰坊食品科技職業學院《醫學細胞生物學實驗技術》2023-2024學年第二學期期末試卷
- 廣東亞視演藝職業學院《圖案構成設計》2023-2024學年第二學期期末試卷
- 河南省漯河市2025屆高三下學期期末統一模擬考試數學試題試卷含解析
- 貴州省獨山縣第四中學2024-2025學年人教版高中歷史試題選修4-1:模塊綜合檢測試題(一)含解析
- 天津國土資源和房屋職業學院《俄語會話(2)》2023-2024學年第二學期期末試卷
- 2024年廣州市高三一模高考英語試卷試題答案詳解(含作文范文)
- (高清版)DZT 0216-2020 煤層氣儲量估算規范
- 中學生文明禮儀教育課件
- JJG 633-2024氣體容積式流量計
- 管網設計方案
- 中西醫結合診療
- 數據庫系統原理教程-清華大學
- 中國東盟物流行業分析
- 2023文化傳媒公司股東協議書
- 三位數除以兩位數-有余數-豎式運算300題
- 播音主持-論脫口秀節目主持人的現狀及發展前景
評論
0/150
提交評論