導航:首頁 > 程序命令 > linuxc調用命令

linuxc調用命令

發布時間:2025-01-28 17:31:13

A. linux怎麼運行c程序

1、打開linux系統,在linux的桌面的空白處右擊。
2、在彈出的下拉選項里,點擊打開終端。
3、在終端窗口中創建一個文件並命名為test.c。在終端輸入touch test.c打開。
4、在終端中輸入vim test.c打開這個文件並編寫代碼。
5、在終端中輸入gcc test.cgcc編譯源文件。
6、在a.out文件的目錄下在終端里輸入./a.out即可運行C程序。

B. 我想在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 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
大概過程就是這樣,你先試一試

D. 如何在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);//關閉。
}

E. linux下怎樣用c語言調用shell命令

C程序調用shell腳本共同擁有三種法子 :system()、popen()、exec系列數call_exec1.c ,
system() 不用你自己去產生進程。它已經封裝了,直接增加自己的命令
exec 須要你自己 fork 進程,然後exec 自己的命令

popen() 也能夠實現運行你的命令,比system 開銷小

方法一、system()的使用。我直接上代碼吧

int system(const char *command);

我在/home/book/shell新建一個test.sh文件例如以下:

<span style="font-size:18px;"><span style="font-size:18px;">#!bin/bash
echo $HOME
echo "the is test!"</span></span>

test.c文件例如以下:

<span style="font-size:18px;"><span style="font-size:18px;">#include<stdlib.h>

int main()
{
system("bash /home/book/shell/test.sh"); /* chmod +x test.sh ,路徑前面要加上bash */
return 0;
}</span></span>

運行例如以下命令來編譯:
<span style="font-size:18px;">gcc test.c -o test
</span>

測試命令:

<span style="font-size:18px;">./test</span>

結果例如以下:

<span style="font-size:18px;">/root
the is test!</span>

方法二:popen() 會調用fork()產生 子歷程,然後從子歷程中調用/bin/sh -c來履行 參數command的指令。參數type可應用 「r」代表讀取。「w」代表寫入。遵循此type值。popen()會建立 管道連到子歷程的標准 輸出設備 或標准 輸入設備 ,然後返回一個文件指針。
隨後歷程便可利用 此文件指針來讀取子歷程的輸出設備 或是寫入到子歷程的標准 輸入設備 中。此外,全部應用 文 件指針(FILE*)操作的函數也都能夠應用 ,除了fclose()以外。

返回值:若成功 則返迴文件指針,否則返回NULL,差錯 原因存於errno中。注意:在編寫具SUID/SGID許可權的程序時請盡量避免應用 popen()。popen()會繼承環境變數。通過環境變數可能會造成系統安全的問題

FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);

其它不用改變我們直接改動test.c文件:

#include<stdio.h>
int main()
{
char buffer[80];
FILE *fp=popen("bash /home/book/shell/test.sh","r");
fgets(buffer,sizeof(buffer),fp);
printf("%s",buffer);
pclose(fp);
return 0;
}

方法三:exec函數簇 (我不太懂,別人的。也沒有驗證。習慣方法一)
須要注意的是exec並非1個函數, 事實上它僅僅是一組函數的統稱, 它包含以下6個函數:

#include <unistd.h>

int execl(const char *path, const char *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 execve(const char *path, char *const argv[], char *const envp[];

能夠見到這6個函數名字不同, 並且他們用於接受的參數也不同.
實際上他們的功能都是幾乎相同的, 由於要用於接受不同的參數所以要用不同的名字區分它們, 畢竟c語言沒有函數重載的功能嘛..

可是實際上它們的命名是有規律的:
exec[l or v][p][e]

exec函數里的參數能夠分成3個部分, 運行文件部分, 命令參數部分, 環境變數部分.
比如我要運行1個命令 ls -l /home/gateman

運行文件部分就是 "/usr/bin/ls"
命令參賽部分就是 "ls","-l","/home/gateman",NULL 見到是以ls開頭 每1個空格都必須分開成2個部分, 並且以NULL結尾的啊.
環境變數部分, 這是1個數組,最後的元素必須是NULL 比如 char * env[] = {"PATH=/home/gateman", "USER=lei", "STATUS=testing", NULL};

好了說下命名規則:
e興許, 參數必須帶環境變數部分, 環境變零部分參數會成為運行exec函數期間的環境變數, 比較少用
l 興許, 命令參數部分必須以"," 相隔, 最後1個命令參數必須是NULL
v 興許, 命令參數部分必須是1個以NULL結尾的字元串指針數組的頭部指針. 比如char * pstr就是1個字元串的指針, char * pstr[] 就是數組了, 分別指向各個字元串.

關於Linux命令的介紹,看看《linux就該這么學》,具體關於這一章地址3w(dot)linuxprobe/chapter-02(dot)html

p興許, 運行文件部分能夠不帶路徑, exec函數會在$PATH中找

還有1個注意的是, exec函數會代替運行它的進程, 也就是說, 一旦exec函數運行成功, 它就不會返回了, 進程結束. 可是假設exec函數運行失敗, 它會返回失敗的信息, 並且進程繼續運行後面的代碼!

通常exec會放在fork() 函數的子進程部分, 來替代子進程運行啦, 運行成功後子程序就會消失, 可是運行失敗的話, 必須用exit()函數來讓子進程退出!

閱讀全文

與linuxc調用命令相關的資料

熱點內容
蘋果手機安卓系統會顯示什麼 瀏覽:265
命令方塊英文名 瀏覽:873
存在即合理演算法 瀏覽:1000
怎麼查看編譯器是c11還是 瀏覽:769
華三伺服器質保期如何查 瀏覽:842
微信ssl加密 瀏覽:590
androidui入門書籍 瀏覽:739
單片機二進制文件加密 瀏覽:116
怎樣給文件夾加上級目錄 瀏覽:163
怎麼給app加密蘋果手機 瀏覽:191
安卓系統怎麼修復 瀏覽:394
09款軒逸空調壓縮機繼電器在哪裡 瀏覽:335
jodconverter源碼 瀏覽:258
小米app免流是什麼免流呢 瀏覽:359
車貸還完辦理解壓需要費用嗎 瀏覽:180
草書字典pdf 瀏覽:69
理財app怎麼看綁的銀行卡號 瀏覽:106
互斥微命令 瀏覽:882
linux掃描病毒 瀏覽:328
文件夾中顯示pdf內容 瀏覽:421