最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++執(zhí)行shell命令的多種實(shí)現(xiàn)方法

 更新時間:2021年11月24日 10:43:18   作者:wang 恒  
在linux系統(tǒng)下,用C++程序執(zhí)行shell命令有多種方式,主要介紹了3中方法,具有一定的參考價值,感興趣的可以了解一下

在linux系統(tǒng)下,用C++程序執(zhí)行shell命令有多種方式

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)生子進(jìn)程,由子進(jìn)程來調(diào)用/bin/sh-cstring來執(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)安全的問題。

函數(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)安全的問題。

范例:

#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)生子進(jìn)程,然后從子進(jìn)程中調(diào)用/bin/sh -c來執(zhí)行參數(shù)command的指令。參數(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中。錯誤代碼 EINVAL參數(shù)type不合法。

注意事項(xiàng):在編寫具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

執(zhí)行 root :x:0 0: root: /root: /bin/bash

3、使用vfork()新建子進(jìn)程,然后調(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++執(zhí)行shell命令的多種實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)C++執(zhí)行shell內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

铅山县| 民勤县| 丹巴县| 永年县| 克什克腾旗| 景谷| 楚雄市| 新平| 中方县| 偃师市| 深圳市| 宁阳县| 荃湾区| 栾川县| 澄江县| 克拉玛依市| 济源市| 都兰县| 开平市| 曲沃县| 彭阳县| 盐城市| 敦化市| 剑阁县| 赤水市| 黄陵县| 衡阳市| 海门市| 正阳县| 鄢陵县| 仁寿县| 财经| 砚山县| 广灵县| 贡嘎县| 景东| 麦盖提县| 道孚县| 廊坊市| 临西县| 应用必备|