国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

解析如何在C語言中調(diào)用shell命令的實現(xiàn)方法

2020-02-24 14:28:10
字體:
供稿:網(wǎng)友

有些函數(shù)很難用C語言編寫,但shell很容易實現(xiàn),用C語言很容易調(diào)用popen函數(shù),本文是武林技術(shù)頻道小編為大家解析如何在C語言中調(diào)用shell命令的實現(xiàn)方法,一起進入下文了解一下吧!

?1、system(執(zhí)行shell 命令)
相關(guān)函數(shù) fork,execve,waitpid,popen
表頭文件 #include<stdlib.h>
定義函數(shù) int system(const char * string);
函數(shù)說明 system()會調(diào)用fork()產(chǎn)生子進程,由子進程來調(diào)用/bin/sh-c
string來執(zhí)行參數(shù)string字符串所代表的命令,此命令執(zhí)行完后隨
即返回原調(diào)用的進程。在調(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 來確認執(zhí)行成功。
附加說明 在編寫具有SUID/SGID權(quán)限的程序時請勿使用system(),system()會
繼承環(huán)境變量,通過環(huán)境變量可能會造成系統(tǒng)安全的問題。
范例:

?

?

?


#include<stdlib.h>
main(){
system(“l(fā)s -al /etc/passwd /etc/shadow”);
}


2、popen(建立管道I/O)
相關(guān)函數(shù) pipe,mkfifo,pclose,fork,system,fopen
表頭文件 #include<stdio.h>
定義函數(shù) FILE * popen( const char * command,const char * type);
函數(shù)說明 popen()會調(diào)用fork()產(chǎn)生子進程,然后從子進程中調(diào)用/bin/sh -c
來執(zhí)行參數(shù)command的指令。參數(shù)type可使用“r”代表讀取,“w”
代表寫入。依照此type值,popen()會建立管道連到子進程的標(biāo)準(zhǔn)輸
出設(shè)備或標(biāo)準(zhǔn)輸入設(shè)備,然后返回一個文件指針。隨后進程便可利
用此文件指針來讀取子進程的輸出設(shè)備或是寫入到子進程的標(biāo)準(zhǔn)輸
入設(shè)備中。此外,所有使用文件指針(FILE*)操作的函數(shù)也都可以使
用,除了fclose()以外。
返回值 若成功則返回文件指針,否則返回NULL,錯誤原因存于errno中。
錯誤代碼 EINVAL參數(shù)type不合法。
注意事項 在編寫具SUID/SGID權(quán)限的程序時請盡量避免使用popen(),popen()
會繼承環(huán)境變量,通過環(huán)境變量可能會造成系統(tǒng)安全的問題。
范例:

?

?

?


#include<stdio.h>
main()
{
FILE * fp;
char buffer[80];
fp=popen(“cat /etc/passwd”,”r”);
fgets(buffer,sizeof(buffer),fp);
printf(“%s”,buffer);
pclose(fp);
}


執(zhí)行 root :x:0 0: root: /root: /bin/bash
3、使用vfork()新建子進程,然后調(diào)用exec函數(shù)族

?

?

?


#include<unistd.h>
main()
{
??? char * argv[ ]={“l(fā)s”,”-al”,”/etc/passwd”,(char*) };

??? if(vfork() = =0)
??? {
??????? execv(“/bin/ls”,argv);
??? }else{???????
??????? printf(“This is the parent process/n”);
??? }
}

以上就是關(guān)于解析如何在C語言中調(diào)用shell命令的實現(xiàn)方法,讀完上面的內(nèi)容相信大家心中有數(shù)了吧?如果你想從事這個行業(yè)的工作,建議你可以多多關(guān)注武林技術(shù)頻道!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 太白县| 合肥市| 托克逊县| 济源市| 吉安县| 正阳县| 增城市| 获嘉县| 龙游县| 霸州市| 赤水市| 项城市| 法库县| 武强县| 保康县| 遂溪县| 西贡区| 甘肃省| 元朗区| 普宁市| 长垣县| 邢台市| 韩城市| 抚顺市| 佛冈县| 阿拉善左旗| 穆棱市| 镇宁| 东乡族自治县| 民乐县| 香格里拉县| 玉山县| 马山县| 张家界市| 怀来县| 新余市| 郁南县| 洞口县| 四平市| 富锦市| 富锦市|