當前位置:首頁 » 編程語言 » c語言實現shell命令

c語言實現shell命令

發布時間: 2023-10-12 11:45:12

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()函數來讓子進程退出!

㈡ linux下如何用c語言調用shell命令

參數type可使用「r」代表讀取,「w」代表寫入。依照此type值,popen()會建立管道連到子進程的標准輸出設備或標准輸入設備,然後返回一個文件指針。隨後進程便可利用此文件指針來讀取子進程的輸出設備或是寫入到子進程的標准輸入設備中。此外,所有使用文件指針(FILE*)操作的函數也都可以使用,除了fclose()以外。 返回值:若成功則返迴文件指針,否則返回NULL,錯誤原因存於errno中。 注意:在編寫具SUID/SGID許可權的程序時請盡量避免使用popen(),popen()會繼承環境變數,通過環境變數可能會造成系統安全的問題。 例:C程序popentest.c內容如下: #include main() { FILE * fp; charbuffer[80]; fp=popen(「~/myprogram/test.sh」,」r」); fgets(buffer,sizeof(buffer),fp); printf(「%s」,buffer); pclose(fp); } 執行結果如下: xiakeyou@ubuntu:~/myprogram$ vim popentest.c xiakeyou@ubuntu:~/myprogram$ gcc popentest.c -o popentest xiakeyou@ubuntu:~/myprogram$ ./popentest /home/d/e/xiakeyou xiakeyou@ubuntu:~/myprogram$ 只是偶能力可能有點有限,沒有太看懂。直接用system()倒是腳本可是執行,只是返回值卻是一塌糊塗,試了多次也沒有找到什麼規律。不免又看了一下上面的那篇博文,得到一些啟發,可以這樣來實現: 先將腳本的返回值利用 echo > XXXXX 輸出到一個本地文件中 當需要這個返回值是,可是通過C語言的文件操作函數來直接從文件中讀取 後來一想,這應該就是上文中POPEN的實現方法! C程序調用shell腳本共有三種法子 :system()、popen()、exec系列函數 system() 不用你自己去產生進程,它已經封裝了,直接加入自己的命令exec 需要你自己 fork 進程,然後exec 自己的命令 popen() 也可以實現執行你的命令,比system 開銷小 1)system(shell命令或shell腳本路徑); system()會調用fork()產生 子歷程,由子歷程來調用/bin/sh-c string來履行 參數string字元串所代表的命令,此命令履行 完後隨即返回原調用的歷程。在調用system()期間SIGCHLD 信號會被暫時擱置,SIGINT和SIGQUIT 信號則會被漠視 。 返回值:如果system()在調用/bin/sh時失敗則返回127,其他失敗原因返回-1。若參數string為空指針(NULL),則返回非零值。 如果 system()調用成功 則最後會返回履行 shell命令後的返回值,但是此返回值也有可能為system()調用/bin/sh失敗所返回的127,因 此最好能再反省 errno 來確認履行 成功 。 system命令以其簡略 高效的作用得到很很廣泛 的利用 ,下面是一個例子 例:在~/test/目錄下有shell腳本test.sh,內容為 #!bin/bash #test.sh echo hello 在同層目錄下新建一個c文件system_test.c,內容為: #include int main() { system("~/test/test.sh"); } 履行 效果 如下: [root@localhost test]$gcc system_test.c -o system_test [root@localhost test]$./system_test hello [root@localhost test]$ 2)popen(char *command,char *type) popen()會調用fork()產生 子歷程,然後從子歷程中調用/bin/sh -c來履行 參數command的指令。參數type可應用 「r」代表讀取,「w」代表寫入。遵循此type值,popen()會建立 管道連到子歷程的標准 輸出設備 或標准 輸入設備 ,然後返回一個文件指針。隨後歷程便可利用 此文件指針來讀取子歷程的輸出設備 或是寫入到子歷程的標准 輸入設備 中。此外,所有應用 文 件指針(FILE*)操作的函數也都可以應用 ,除了fclose()以外。 返回值:若成功 則返迴文件指針,否則返回NULL,差錯 原因存於errno中。

㈢ 如何在C語言中調用shell命令

C語言中調用shell指令,根據調用指令目的,可以區分如下兩種情況:

一、需要shell指令執行某一功能,如創建文件夾,或者刪除文件夾等,程序中不關注shell指令的輸出,那麼可以使用system函數。

system函數聲明於stdlib.h, 功能為調用系統命令,形式為

int system(const char *cmd);

其中cmd為要執行的命令字元串,返回值為執行是否成功的標記。

比如在Linux下要刪除當前文件夾下的所有擴展名為a的文件,即*.a, 可以寫作

system("rm*.a-f");

二、不僅要執行shell命令,還需要得知運行的列印結果,並在程序中使用。

對於此,有兩種方案:

1、用system命令,將輸出重定向到一個txt文件中,執行後,再讀取txt文件,使用後刪除。

比如Linux下獲取剩餘內存的指令可以寫作:

system("free>result.txt");//結果重定向到result.txt中。
FILE*fp=fopen("result.txt","r");//打開文件。
intr;
while(fgetc(fp)!=' ');//忽略第一行。
fscanf(fp,"%*s%*d%*d%d",&r);//讀取第四個域的值,即剩餘內存值。
printf("剩餘內存為%dKB ",r);//列印結果。
fclose(fp);//關閉文件。
unlink("result.txt");//刪除臨時文件。

2、使用重定向,需要經過磁碟讀寫,還要刪除文件,相對低效。同時還有可能出現臨時文件和已有文件重名,導致誤刪數據的情況。 所以一般使用更方便快捷的方式,即調用popen。

FILE *popen(const char *cmd, const char *mode);

使用popen的功能和system類似,屬於方法1中執行命令和打開文件的一個組合。不過這里用到的文件是隱式的,並不會在系統中真正存在。返回的指針即結果文件指針。 當使用pclose關閉後,文件自動銷毀。

方法1中的例子,用popen實現如下:

FILE*fp=popen("free","r");//執行命令,同時創建管道文件。
intr;
while(fgetc(fp)!=' ');//忽略第一行。
fscanf(fp,"%*s%*d%*d%d",&r);//讀取第四個域的值,即剩餘內存值。
printf("剩餘內存為%dKB ",r);//列印結果。
pclose(fp);//關閉並銷毀管道文件。

三、注意事項:

雖然調用shell命令有時可以大大減少代碼量,甚至有千行代碼不如一句shell的說法,不過調用shell命令還是有局限性的:

1、使用shell命令會調用系統資源,效率偏低;

2、不同平台的shell指令不同,導致可移植性下降;

3、調用shell命令時會復制當前進程(fork),如果當前進程的資源佔有比較大,會導致瞬間資源佔用極大,甚至可能出現失敗。

所以,在編碼時,除非是測試性的代碼,否則在正式代碼中不建議使用shell。

㈣ 如何在C語言中執行shell命令

可以通過system函數,調用shell命令。
1 函數原型:
int system(const char *cmd);
2 功能:
調用cmd內容的系統命令,即shell命令。
3 頭文件:
stdlib.h
4 舉例:
system("ls");
列印當前工作目錄下的文件。

熱點內容
iisftp被動模式 發布:2025-02-01 04:41:50 瀏覽:350
車載安卓怎麼安裝軟體 發布:2025-02-01 04:30:50 瀏覽:469
安卓系統su程序是什麼 發布:2025-02-01 04:25:42 瀏覽:475
android代碼行數統計 發布:2025-02-01 04:20:47 瀏覽:216
快速喊話腳本 發布:2025-02-01 04:16:48 瀏覽:885
如何分辨普拉多的配置 發布:2025-02-01 04:11:45 瀏覽:681
linuxc文件刪除 發布:2025-02-01 04:11:33 瀏覽:218
c語言稀疏矩陣轉置矩陣 發布:2025-02-01 03:47:57 瀏覽:531
坦克世界掛機腳本有哪些 發布:2025-02-01 03:07:41 瀏覽:134
串口編程at 發布:2025-02-01 03:06:05 瀏覽:909