欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

linuxc調(diào)用命令行 C++調(diào)用命令行

如何在C語言編程中調(diào)用linux系統(tǒng)終端下的命令

system(執(zhí)行shell 命令)

創(chuàng)新互聯(lián)公司服務(wù)項目包括都安網(wǎng)站建設(shè)、都安網(wǎng)站制作、都安網(wǎng)頁制作以及都安網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,都安網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到都安省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

相關(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 信號會被暫時擱置,SIGINT和SIGQUIT 信號則會被忽略。

返回值 如果system()在調(diào)用/bin/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)限的程序時請勿使用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

如何在自己寫的 Linux C 程序中以一種優(yōu)雅的方式調(diào)用一些命令

Linux C編程啟動另一個可執(zhí)行文件或調(diào)用命令用system函數(shù)最理想了,這個函數(shù)原理是在你編寫的那個程序的內(nèi)部啟動另一個程序或命令,從而創(chuàng)建一個新進(jìn)程,并等待這個進(jìn)程執(zhí)行完畢退出。如果正常執(zhí)行,system函數(shù)將返回被執(zhí)行程序或命令的退出碼;如果無法運(yùn)行這個程序或命令,將返回錯誤代碼127;如果是其他錯誤,返回-1。這個函數(shù)的原型是:

#include stdlib.h

int system(const char *string);

參數(shù)string是將要執(zhí)行的程序或命令的命令字符串。

還有一種執(zhí)行外部程序的方法是exec系列函數(shù),但這個系列的函數(shù)都是將當(dāng)前進(jìn)程的替換成新進(jìn)程,也就是說新進(jìn)程啟動后原來的進(jìn)程就不存在了,exec系列函數(shù)后面的那些代碼就不會再執(zhí)行了。所以我一般是用system函數(shù)調(diào)用Linux命令。

linux下怎樣用c語言調(diào)用shell命令

C程序調(diào)用shell腳本共同擁有三種法子 :system()、popen()、exec系列數(shù)call_exec1.c ,

system() 不用你自己去產(chǎn)生進(jìn)程。它已經(jīng)封裝了,直接增加自己的命令

exec 須要你自己 fork 進(jìn)程,然后exec 自己的命令

popen() 也能夠?qū)崿F(xiàn)運(yùn)行你的命令,比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;"#includestdlib.h

int main()

{

system("bash /home/book/shell/test.sh"); /* chmod +x test.sh ,路徑前面要加上bash */

return 0;

}/span/span

運(yùn)行例如以下命令來編譯:

span style="font-size:18px;"gcc test.c -o test

/span

測試命令:

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

結(jié)果例如以下:

span style="font-size:18px;"/root

the is test!/span

方法二:popen() 會調(diào)用fork()產(chǎn)生 子歷程,然后從子歷程中調(diào)用/bin/sh -c來履行 參數(shù)command的指令。參數(shù)type可應(yīng)用 “r”代表讀取?!皐”代表寫入。遵循此type值。popen()會建立 管道連到子歷程的標(biāo)準(zhǔn) 輸出設(shè)備 或標(biāo)準(zhǔn) 輸入設(shè)備 ,然后返回一個文件指針。

隨后歷程便可利用 此文件指針來讀取子歷程的輸出設(shè)備 或是寫入到子歷程的標(biāo)準(zhǔn) 輸入設(shè)備 中。此外,全部應(yīng)用 文 件指針(FILE*)操作的函數(shù)也都能夠應(yīng)用 ,除了fclose()以外。

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

FILE *popen(const char *command, const char *type);

int pclose(FILE *stream);

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

#includestdio.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函數(shù)簇 (我不太懂,copy別人的。也沒有驗(yàn)證。習(xí)慣方法一)

須要注意的是exec并非1個函數(shù), 事實(shí)上它僅僅是一組函數(shù)的統(tǒng)稱, 它包含以下6個函數(shù):

#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個函數(shù)名字不同, 并且他們用于接受的參數(shù)也不同.

實(shí)際上他們的功能都是幾乎相同的, 由于要用于接受不同的參數(shù)所以要用不同的名字區(qū)分它們, 畢竟c語言沒有函數(shù)重載的功能嘛..

可是實(shí)際上它們的命名是有規(guī)律的:

exec[l or v][p][e]

exec函數(shù)里的參數(shù)能夠分成3個部分, 運(yùn)行文件部分, 命令參數(shù)部分, 環(huán)境變量部分.

比如我要運(yùn)行1個命令 ls -l /home/gateman

運(yùn)行文件部分就是 "/usr/bin/ls"

命令參賽部分就是 "ls","-l","/home/gateman",NULL 見到是以ls開頭 每1個空格都必須分開成2個部分, 并且以NULL結(jié)尾的啊.

環(huán)境變量部分, 這是1個數(shù)組,最后的元素必須是NULL 比如 char * env[] = {"PATH=/home/gateman", "USER=lei", "STATUS=testing", NULL};

好了說下命名規(guī)則:

e興許, 參數(shù)必須帶環(huán)境變量部分, 環(huán)境變零部分參數(shù)會成為運(yùn)行exec函數(shù)期間的環(huán)境變量, 比較少用

l 興許, 命令參數(shù)部分必須以"," 相隔, 最后1個命令參數(shù)必須是NULL

v 興許, 命令參數(shù)部分必須是1個以NULL結(jié)尾的字符串指針數(shù)組的頭部指針. 比如char * pstr就是1個字符串的指針, char * pstr[] 就是數(shù)組了, 分別指向各個字符串.

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

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

還有1個注意的是, exec函數(shù)會代替運(yùn)行它的進(jìn)程, 也就是說, 一旦exec函數(shù)運(yùn)行成功, 它就不會返回了, 進(jìn)程結(jié)束. 可是假設(shè)exec函數(shù)運(yùn)行失敗, 它會返回失敗的信息, 并且進(jìn)程繼續(xù)運(yùn)行后面的代碼!

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

linux 下如何編寫c程序,獲得命令行結(jié)果?

void executeShell(const char *shell){

FILE *stream;

char buf[1024];

memset( buf, '\0', sizeof(buf) );//初始化buf,以免后面寫如亂碼到文件中

stream = popen( shell , "r" ); ? //將命令的輸出 通過管道讀?。ā皉”參數(shù))到FILE* stream

fread( buf, sizeof(char), sizeof(buf), stream); //將剛剛FILE* stream的數(shù)據(jù)流讀取到buf中

pclose( stream );

printf("%s \n",buf);//打印輸出結(jié)果

}

linux下如何用c語言調(diào)用shell命令

參數(shù)type可使用“r”代表讀取,“w”代表寫入。依照此type值,popen()會建立管道連到子進(jìn)程的標(biāo)準(zhǔn)輸出設(shè)備或標(biāo)準(zhǔn)輸入設(shè)備,然后返回一個文件指針。隨后進(jìn)程便可利用此文件指針來讀取子進(jìn)程的輸出設(shè)備或是寫入到子進(jìn)程的標(biāo)準(zhǔn)輸入設(shè)備中。此外,所有使用文件指針(FILE*)操作的函數(shù)也都可以使用,除了fclose()以外。 返回值:若成功則返回文件指針,否則返回NULL,錯誤原因存于errno中。 注意:在編寫具SUID/SGID權(quán)限的程序時請盡量避免使用popen(),popen()會繼承環(huán)境變量,通過環(huán)境變量可能會造成系統(tǒng)安全的問題。 例:C程序popentest.c內(nèi)容如下: #includestdio.h main() { FILE * fp; charbuffer[80]; fp=popen(“~/myprogram/test.sh”,”r”); fgets(buffer,sizeof(buffer),fp); printf(“%s”,buffer); pclose(fp); } 執(zhí)行結(jié)果如下: 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$ 只是偶能力可能有點(diǎn)有限,沒有太看懂。直接用system()倒是腳本可是執(zhí)行,只是返回值卻是一塌糊涂,試了多次也沒有找到什么規(guī)律。不免又看了一下上面的那篇博文,得到一些啟發(fā),可以這樣來實(shí)現(xiàn): 先將腳本的返回值利用 echo XXXXX 輸出到一個本地文件中 當(dāng)需要這個返回值是,可是通過C語言的文件操作函數(shù)來直接從文件中讀取 后來一想,這應(yīng)該就是上文中POPEN的實(shí)現(xiàn)方法! C程序調(diào)用shell腳本共有三種法子 :system()、popen()、exec系列函數(shù) system() 不用你自己去產(chǎn)生進(jìn)程,它已經(jīng)封裝了,直接加入自己的命令exec 需要你自己 fork 進(jìn)程,然后exec 自己的命令 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 信號會被暫時擱置,SIGINT和SIGQUIT 信號則會被漠視 。 返回值:如果system()在調(diào)用/bin/sh時失敗則返回127,其他失敗原因返回-1。若參數(shù)string為空指針(NULL),則返回非零值。 如果 system()調(diào)用成功 則最后會返回履行 shell命令后的返回值,但是此返回值也有可能為system()調(diào)用/bin/sh失敗所返回的127,因 此最好能再反省 errno 來確認(rèn)履行 成功 。 system命令以其簡略 高效的作用得到很很廣泛 的利用 ,下面是一個例子 例:在~/test/目錄下有shell腳本test.sh,內(nèi)容為 #!bin/bash #test.sh echo hello 在同層目錄下新建一個c文件system_test.c,內(nèi)容為: #includestdlib.h 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()會調(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è)備 ,然后返回一個文件指針。隨后歷程便可利用 此文件指針來讀取子歷程的輸出設(shè)備 或是寫入到子歷程的標(biāo)準(zhǔn) 輸入設(shè)備 中。此外,所有應(yīng)用 文 件指針(FILE*)操作的函數(shù)也都可以應(yīng)用 ,除了fclose()以外。 返回值:若成功 則返回文件指針,否則返回NULL,差錯 原因存于errno中。

當(dāng)前題目:linuxc調(diào)用命令行 C++調(diào)用命令行
標(biāo)題路徑:http://aaarwkj.com/article24/doodece.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、自適應(yīng)網(wǎng)站、網(wǎng)站收錄、企業(yè)建站網(wǎng)站設(shè)計、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名
黄片小视频在线免费播放| 美女在线免费观看av| 天堂av日韩在线播放| 极品人妻视频中文字幕| 在线免费观看国产黄色av| 免费女同一区二区三区| 白白色成人永久在线观看视频| 在线日韩观看免费av| 一起草视频在线观看视频| 97久久精品亚洲中文字幕| 韩国黄色理论片一区二区麻豆| 91亚洲欧美日韩在线观看| 日本人妻中文字幕一区| 亚洲午夜天堂精品福利天堂| 日本精品国产一区二区在线| 日韩爱视频一区二区| av中文字幕乱码在线看| 日韩精品国产专区一区| 亚洲国产免费一区二区| 亚洲精品在线一二三区| 亚洲精品视频在线观看视频| 国产三级三级三级三级| 日韩欧美国产综合一区二区| av亚洲天堂免费观看| 粉嫩一区二区三区在线| 人人澡人人看人人妻| 国产男女免费操作视频| 视频精品一区二区在线观看| 亚洲三级黄片免费播放| 天堂网一区二区三区四区| 三欲一区二区三区中文字幕 | 欧美日韩亚洲精品综合网| 亚洲男人天堂超碰在线| 一区二区中文字幕精品| 亚洲欧美午夜激情啪啪视频| 国产熟女一区二区精品视频| 国产精品高清另类一区二区三区| 日本人妻系列在线播放| 国产一区二区三区的网站| 国产av剧情在线免费观看| 国产精品一级在线播放|