導航:首頁 > 編程系統 > c調用linux

c調用linux

發布時間:2025-02-06 00:40:10

linux c調用so

實例代碼(soTest.c):

1 #include <stdio.h>
2 #include <dlfcn.h>
3
4 int main(int argc, char *argv[]){
5 void * libm_handle = NULL;
6 float (*cosf_method)(float);
7 char *errorInfo;
8 float result;
9
10 // dlopen 函數還會自動解析共享庫中的依賴項。這樣,如果您打開了一個依賴於其他共享庫的對象,它就會自動載入它們。
11 // 函數返回一個句柄,該句柄用於後續的 API 調用
12 libm_handle = dlopen("libm.so", RTLD_LAZY );
13 // 如果返回 NULL 句柄,表示無法找到對象文件,過程結束。否則的話,將會得到對象的一個句柄,可以進一步詢問對象
14 if (!libm_handle){
15 // 如果返回 NULL 句柄,通過dlerror方法可以取得無法訪問對象的原因
16 printf("Open Error:%s.\n",dlerror());
17 return 0;
18 }
19
20 // 使用 dlsym 函數,嘗試解析新打開的對象文件中的符號。您將會得到一個有效的指向該符號的指針,或者是得到一個 NULL 並返回一個錯誤
21 cosf_method = dlsym(libm_handle,"cosf");
22 errorInfo = dlerror();// 調用dlerror方法,返回錯誤信息的同時,內存中的錯誤信息被清空
23 if (errorInfo != NULL){
24 printf("Dlsym Error:%s.\n",errorInfo);
25 return 0;
26 }
27
28 // 執行「cosf」方法
29 result = (*cosf_method)(0.0);
30 printf("result = %f.\n",result);
31
32 // 調用 ELF 對象中的目標函數後,通過調用 dlclose 來關閉對它的訪問
33 dlclose(libm_handle);
34
35 return 0;
36 }

在這個例子中主要是調用了 math 庫(libm.so)中的「cosf」函數,dlopen函數的第二個參數表示載入庫文件的模式,主要有兩種:RTLD_LAZY 暫緩決定,等有需要時再解出符號;RTLD_NOW 立即決定,返回前解除所有未決定的符號。另外記得引用包含API的頭文件「#include <dlfcn.h>」(^_^)。

Ⅱ linux c編程調用系統的動態庫時,要使用dlopen等函數嗎

linux調用庫的方式有三種:
1.靜態鏈接庫
2.動態鏈接庫
3.動態載入庫
其中1,2都是在編程時直接調用,在鏈接時加參數-l進行鏈接
第三種需要在編程時使用dlopen等函數來獲取庫裡面函數的定義,然後進行調用.
不過對於沒有提供頭文件的動態庫,只能dlopen等函數來調用

Ⅲ linux c++動態庫 調用 c動態庫函數

先把.cpp編譯成動態庫,編譯方法:
g++ *.cpp –fPIC –shared –o libtest.so -libyourclib.so
其中,*.cpp表示你的.cpp文件,專你可以屬把它們一一列出,
–fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯後的代碼是位置相關的,所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的。
–shared:指明編譯成動態庫。
libtest.so即為生成的動態庫,以lib開頭,方便後面使用
-libyourclib.so 是你的c動態庫名

編譯好之後,就可以來編譯你的測試程序了:
gcc test.c -o test -ltest
其中,test是生成的可執行程序
-ltest表示引用生成的動態庫libtest.so
大概過程就是這樣,你先試一試

Ⅳ 如何在C語言編程中調用linux系統終端下的命令

根據調用需求,可以分為兩種:

一、僅執行系統命令,不需要該命令的列印結果。內

這種情況可以用system函數。形容式為

system(cmd);

其中cmd為char*類型的字元串,包含要執行的命令,命令的執行結果會輸出到標准輸出。

比如

system("mkdirtest");

這個執行,會在當前文件夾下創建test文件夾。

二、需要命令執行的列印。

雖然同樣可以使用system並重定向到文件,然後打開文件讀取,最終刪除文件。但這樣做比較繁瑣,更好的做法是使用popen。

FILE *fp = popen(cmd);

執行cmd中的命令,然後可以以C文件操作方式,讀取命令的輸出結果。比如:

if((fp=popen("pwd","r"))==NULL)//執行獲取當前目錄的系統命令pwd。
{
printf("執行失敗 ");//fp為NULL表示命令執行失敗。
}
else
{
chars[100];
while(fgets(s,100,fp))//獲取文件內容。
printf("%s",s);//輸出結果。
pclose(fp);//關閉。
}

Ⅳ 我想在linux下寫一個c程序調用linux的可執行文件或者程序,怎麼做

Linux C編程中,調用另一個可執行文件或調用命令用system函數最簡單了,這個函數原理是在你編寫的那個程序的內部啟動另一個程序或命令,從而創建一個新進程,並等待這個進程執行完畢退出。如果正常執行,system函數將返回被執行程序或命令的退出碼;如果無法運行這個程序或命令,將返回錯誤代碼127;如果是其他錯誤,返回-1。這個函數的原型是:
#include <stdlib.h>
int system(const char *string);
參數string是將要執行的程序文件名或路徑,如果是啟動一個命令就是一個命令字元串。
還有一種執行外部程序的方法是exec系列函數,一般是在fork的子進程裡面調用exec系列函數,那主進程里直接調用exec系列不行嗎,為什麼要fork再在子進程里調用呢?因為exec系列的函數(包括execl函數)是將當前進程替換成新進程,這里的當前進程就是你編寫的程序,也就是說新進程啟動後調用exec函數的進程就不存在了,所以exec系列函數調用之後的代碼就不會再執行了。如果你不放在fork子進程裡面,那你編寫的程序的主進程在執行execl函數後就完全不存在了,所以exec系列函數的使用都是先fork然後在子進程裡面調用。因為exec系列函數都要使用fork調用,所以我一般是用system函數。

閱讀全文

與c調用linux相關的資料

熱點內容
u盤格式化量產工具 瀏覽:646
列印文件字體間距多少合適 瀏覽:407
除了中國知網還有什麼學術的網站 瀏覽:149
微信轉發文件最多多少個 瀏覽:612
mac導出mp4格式的文件怎麼打開 瀏覽:944
抖音app的會話在哪裡 瀏覽:270
女聖職者升級禮包地址 瀏覽:461
哪些網站消費屬於境外消費 瀏覽:989
java中的class文件是什麼 瀏覽:401
哪裡可以查環境數據 瀏覽:935
魅族18桌面大文件夾 瀏覽:457
蘋果手機有photoshop嗎 瀏覽:120
壓縮文件下載後怎麼找位置 瀏覽:664
一汽大眾app修改密碼在哪裡 瀏覽:153
如何開展數據化分析 瀏覽:846
寶寶故事動畫app 瀏覽:820
iphone無法訪問文檔 瀏覽:772
哪裡可以查詢上市公司財報數據 瀏覽:751
加工中心圓周銑孔如何手動編程 瀏覽:308
誅仙飛升135後怎麼升級 瀏覽:419

友情鏈接