在c語言中調(diào)用shell命令的方法實(shí)現(xiàn)。
零陵ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
c程序調(diào)用shell腳本共有兩種方法
:system()、popen(),分別如下:
system()
不用自己去創(chuàng)建進(jìn)程,系統(tǒng)已經(jīng)封裝了這一步,直接加入自己的命令即可
popen()
也可以實(shí)現(xiàn)執(zhí)行的命令,比system
開銷小
以下分別說明:
1)system(shell命令或shell腳本路徑);
system()
會調(diào)用fork()產(chǎn)生
子歷程,由子歷程來調(diào)用/bin/sh-c
string來履行
參數(shù)string字符串所代表的命令,此命令履行
完后隨即返回原調(diào)用的歷程。在調(diào)用system()期間sigchld
信號會被暫時(shí)擱置,sigint和sigquit
信號則會被漠視
。
返
回值:如果system()在調(diào)用/bin/sh時(shí)失敗則返回127,其他失敗原因返回-1。若參數(shù)string為空指針(null),則返回非零值。
如果
system()調(diào)用成功
則最后會返回履行
shell命令后的返回值,但是此返回值也有可能為system()調(diào)用/bin/sh失敗所返回的127,因
此最好能再反省
errno
來確認(rèn)履行
成功
。
system命令以其簡略
高效的作用得到很很廣泛
的利用
,下面是一個(gè)例子
例:在/tmp/testdir/目錄下有shell腳本tsh.sh,內(nèi)容為
#!/bin/sh
wget
$1
echo
"done!"
2)popen(char
*command,char
*type)
popen()
會調(diào)用fork()產(chǎn)生
子歷程,然后從子歷程中調(diào)用/bin/sh
-c來履行
參數(shù)command的指令。參數(shù)type可應(yīng)用
“r”代表讀取,“w”代表寫入。遵循此type值,popen()會建立
管道連到子歷程的標(biāo)準(zhǔn)
輸出設(shè)備
或標(biāo)準(zhǔn)
輸入設(shè)備
,然后返回一個(gè)文件指針。隨后歷程便可利用
此文件指針來讀取子歷程的輸出設(shè)備
或是寫入到子歷程的標(biāo)準(zhǔn)
輸入設(shè)備
中。此外,所有應(yīng)用
文
件指針(file*)操作的函數(shù)也都可以應(yīng)用
,除了fclose()以外。
返回值:若成功
則返回文件指針,否則返回null,差錯(cuò)
原因存于errno中。注意:在編寫具suid/sgid權(quán)限的程序時(shí)請盡量避免應(yīng)用
popen(),popen()會繼承環(huán)境變量,通過環(huán)境變量可能會造成系統(tǒng)安全的問題。
例:c程序popentest.c內(nèi)容如下:
#include
main
{
file
*
fp;
charbuffer[80];
fp=popen(“~/myprogram/test.sh”,”r”);
fgets(buffer,sizeof(buffer),fp);
printf(“%s”,buffer);
pclose(fp);
}
liunx是系統(tǒng),你學(xué)linux一般就是學(xué)習(xí)使用系統(tǒng)而已,難道是要開發(fā)linux嗎?
linux有圖形界面版和命令行版,一般服務(wù)器就是命令行版本。你說學(xué)習(xí)linux,應(yīng)該就是學(xué)習(xí)使用命令行版linux了,主要涉及復(fù)制,移動(dòng),編輯,創(chuàng)建目錄,創(chuàng)建文件,更改權(quán)限,配置網(wǎng)絡(luò),查看進(jìn)程等命令操作。圖形界面和命令行的區(qū)別就是:圖形界面直觀易操作,不過占資源比較多,命令行反之。
shell 編程,主要是控制進(jìn)程和文件,以及啟動(dòng)和控制其它程序。shell 通過提示您輸入,向操作系統(tǒng)解釋該輸入,然后處理來自操作系統(tǒng)的任何結(jié)果輸出來管理您與操作系統(tǒng)之間的交互。一般用于系統(tǒng)的運(yùn)維。
c語言是編程語言,開發(fā)系統(tǒng)用的,也可以做嵌入式,例如linux就是c語言開發(fā)的。你想要做c開發(fā)就學(xué)c,想要java開發(fā)就學(xué)java,這些編程語言的學(xué)習(xí)都能在win或linux中進(jìn)行。
Linux正在成為開發(fā)人員的編程天堂,成為開源和免費(fèi)操作系統(tǒng)。 Turbo C編譯器已經(jīng)是一種編譯程序的舊方法,所以讓程序員轉(zhuǎn)向Linux以獲得新的編程環(huán)境。 在本文中,我們將解釋如何編寫,編譯和運(yùn)行一個(gè)簡單的C程序。 這將成為您遷移到可以在Linux上編寫和執(zhí)行的更復(fù)雜和有用的C程序的基礎(chǔ)。
我們在Ubuntu 18.04 LTS系統(tǒng)上運(yùn)行了本文中提到的步驟和命令。
我們將使用Linux命令行工具Terminal,以編譯一個(gè)簡單的C程序。 要打開終端,您可以使用Ubuntu Dash或Ctrl + Alt + T快捷方式。
第1步:安裝build-essential軟件包
為了編譯和執(zhí)行C程序,您需要在系統(tǒng)上安裝必要的軟件包。 在Linux終端中以root用戶身份輸入以下命令:
sudo apt-get install build-essential
系統(tǒng)會要求您輸入root用戶密碼; 安裝過程將在此之后開始。 請確保您已連接到互聯(lián)網(wǎng)。
第2步:編寫一個(gè)簡單的C程序
安裝必要的軟件包之后,讓我們編寫一個(gè)簡單的C程序。
打開Ubuntu的圖形文本編輯器,將以下示例程序?qū)懭牖驈?fù)制到其中:
#includestdio.h
int main()
{
printf("nA sample C program ");
return 0;
}
然后使用.c擴(kuò)展名保存文件。 在這個(gè)例子中,我將我的C程序命名為linuxidc.c
或者,您可以通過gedit中的終端編寫C程序,如下所示:
gedit linuxidc.c
這將創(chuàng)建一個(gè).c文件,您可以在其中編寫和保存程序。
第3步:使用gcc編譯C程序
在終端中,輸入以下命令以生成您編寫的程序的可執(zhí)行版本:
句法:
$ gcc [programName].c -o programName
示例:
$ gcc linuxidc.c -o linuxidc
1、打開kali linux的終端。創(chuàng)建一個(gè)文件并命名為test.c。在終端輸入:touch test.c。
2、可以看到已經(jīng)生成了一個(gè)后綴為test.c的源文件。然后用vim工具打開這個(gè)文件并編寫代碼。在終端中輸入:vim test.c或者gvim test.c打開這個(gè)文件并編寫代碼。
3、編寫完了這個(gè)代碼。現(xiàn)在開始編譯源文件。在終端中輸入:gcc test.cgcc是linux自帶的c語言編譯器。如果是windows則要用ide工具來編譯。linux系統(tǒng)一般寫C語言用gcc +vim+gdb三個(gè)自帶的工具就可以了。
4、打完gcc test.c編譯完C源文件。然后就可以看見a.out的文件。一般linux系統(tǒng)就默認(rèn)為a.out為編譯完的文件。現(xiàn)在運(yùn)行a.out文件。在a.out文件的目錄下打開終端并輸入./a.out就是運(yùn)行文件了。
5、如果想要編譯完的文件名不要用a.out文件。就可以在編譯時(shí)打入.gcc test.c -o test.out然后就可以看見有一個(gè)test.out.文件 了。-o后面跟著的編譯生成的文件名。
6、再運(yùn)行test.out在終端中輸入./test.out結(jié)果如圖。這樣在linux系統(tǒng)下編譯并運(yùn)行C語言就完成了。
system(執(zhí)行shell 命令)
相關(guān)函數(shù) fork,execve,waitpid,popen
表頭文件 #includestdlib.h
定義函數(shù) int system(const char * string);
函數(shù)說明 system()會調(diào)用fork()產(chǎn)生子進(jìn)程,由子進(jìn)程來調(diào)用/bin/sh-c string來執(zhí)行參數(shù)string字符串所代表的命令,此命令執(zhí)行完后隨即返回原調(diào)用的進(jìn)程。在調(diào)用system()期間SIGCHLD 信號會被暫時(shí)擱置,SIGINT和SIGQUIT 信號則會被忽略。
返回值 如果system()在調(diào)用/bin/sh時(shí)失敗則返回127,其他失敗原因返回-1。若參數(shù)string為空指針(NULL),則返回非零值。如果system()調(diào)用成功則最后會返回執(zhí)行shell命令后的返回值,但是此返回值也有可能為system()調(diào)用/bin/sh失敗所返回的127,因此最好能再檢查errno 來確認(rèn)執(zhí)行成功。
附加說明 在編寫具有SUID/SGID權(quán)限的程序時(shí)請勿使用system(),system()會繼承環(huán)境變量,通過環(huán)境變量可能會造成系統(tǒng)安全的問題。
范例 #includestdlib.h
main()
{
system(“l(fā)s -al /etc/passwd /etc/shadow”);
}
執(zhí)行 -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
-r--------- 1 root root 572 Sep 2 15 :34 /etc/shadow