欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

相關函數:fork,execve,waitpid,popen

表頭文件:#include<stdlib.h>

函數原型:int system(const char * string);

函數說明 :system()會調用fork()產生子進程,由子進程來調用/bin/sh-cstring來執(zhí)行參數string字符串所代表的命令,此命令執(zhí)行完后隨即返回原調用的進程。在調用system()期間SIGCHLD 信號會被暫時擱置,SIGINT和SIGQUIT 信號則會被忽略。

返回值 如果system()在調用/bin/sh時失敗則返回127,其他失敗原因返回-1。若參數string為空指針(NULL),則返回非零值。如果system()調用成功則最后會返回執(zhí)行shell命令后的返回值,但是此返回值也有可能為system()調用/bin/sh失敗所返回的127,因此最好能再檢查errno 來確認執(zhí)行成功。

附加說明 :在編寫具有SUID/SGID權限的程序時請勿使用system(),system()會繼承環(huán)境變量,通過環(huán)境變量可能會造成系統(tǒng)安全的問題。

函數說明:system() 會調用fork()產生子進程,由子進程來調用/bin/sh-c string來執(zhí)行參數string字符串所代表的命令,此命令執(zhí)行完后隨即返回原調用的進程。在調用system()期間SIGCHLD 信號會被暫時擱置,SIGINT和SIGQUIT 信號則會被忽略。

返回值:如果system()在調用/bin/sh時失敗則返回127,其他失敗原因返回-1。若參數string為空指針(NULL),則返回非零值。如果 system()調用成功則最后會返回執(zhí)行shell命令后的返回值,但是此返回值也有可能為system()調用/bin/sh失敗所返回的127,因此最好能再檢查errno 來確認執(zhí)行成功。

附加說明:在編寫具有SUID/SGID權限的程序時請勿使用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)

相關函數:pipe,mkfifo,pclose,fork,system,fopen

表頭文件 #include<stdio.h>

函數原型: FILE * popen( const char * command,const char * type);

函數說明 :popen()會調用fork()產生子進程,然后從子進程中調用/bin/sh -c來執(zhí)行參數command的指令。參數type可使用“r”代表讀取,“w”代表寫入。依照此type值,popen()會建立管道連到子進程的標準輸出設備或標準輸入設備,然后返回一個文件指針。隨后進程便可利用此文件指針來讀取子進程的輸出設備或是寫入到子進程的標準輸入設備中。此外,所有使用文件指針(FILE*)操作的函數也都可以使用,除了fclose()以外。

返回值: 若成功則返回文件指針,否則返回NULL,錯誤原因存于errno中。錯誤代碼 EINVAL參數type不合法。

注意事項:在編寫具SUID/SGID權限的程序時請盡量避免使用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()新建子進程,然后調用exec函數族

#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”);
    }
} 

到此這篇關于C++執(zhí)行shell命令的多種實現方法的文章就介紹到這了,更多相關C++執(zhí)行shell內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++ Qt開發(fā)之ComboBox下拉組合框組件用法詳解

    C++ Qt開發(fā)之ComboBox下拉組合框組件用法詳解

    Qt 是一個跨平臺C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺窗體應用程序,在Qt中,ComboBox(組合框)是一種常用的用戶界面控件,它提供了一個下拉列表,允許用戶從預定義的選項中選擇一個,本文給大家介紹QComboBox類的一些常用方法,需要的朋友可以參考下
    2023-12-12
  • C語言模擬實現掃雷游戲

    C語言模擬實現掃雷游戲

    這篇文章主要為大家詳細介紹了C語言模擬實現掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • 解析C++中多層派生時的構造函數及一些特殊形式

    解析C++中多層派生時的構造函數及一些特殊形式

    這篇文章主要介紹了解析C++中多層派生時的構造函數及一些特殊形式,特殊形式主要針對基類和子對象類型的構造函數內容,需要的朋友可以參考下
    2015-09-09
  • C++中的循環(huán)引用

    C++中的循環(huán)引用

    雖然C++11引入了智能指針的,但是開發(fā)人員在與內存的斗爭問題上并沒有解放,如果我門實用不當仍然有內存泄漏問題,其中智能指針的循環(huán)引用缺陷是最大的問題。下面通過實例代碼給大家介紹c++中的循環(huán)引用,一起看看吧
    2017-09-09
  • C語言直接插入排序算法介紹及示例

    C語言直接插入排序算法介紹及示例

    插入排序是把一個記錄插入到已排序的有序序列中,使整個序列在插入該記錄后仍然有序。插入排序中較簡單的種方法是直接插入排序,其插入位置的確定方法是將待插入的記錄與有序區(qū)中的各記錄自右向左依次比較其關鍵字值的大小
    2022-08-08
  • C語言內存對齊實例詳解

    C語言內存對齊實例詳解

    這篇文章主要介紹了C語言內存對齊,包括內存對其的基本概念及用法,以及注意事項,并以實例形式加以說明,需要的朋友可以參考下
    2014-09-09
  • Qt+OpenCV利用幀差法實現車輛識別

    Qt+OpenCV利用幀差法實現車輛識別

    所謂幀差法也就是對連續(xù)圖像幀做差分運算,其結果與定義好的閾值比較,若大于閾值則為運動目標值為1,否則值為0?。本文將利用幀差法實現車輛識別,感興趣的可以了解一下
    2022-08-08
  • C語言實現學生成績管理系統(tǒng)項目

    C語言實現學生成績管理系統(tǒng)項目

    這篇文章主要為大家詳細介紹了C語言實現學生成績管理系統(tǒng)項目,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C語言內存操作函數使用示例梳理講解

    C語言內存操作函數使用示例梳理講解

    這篇文章主要介紹了C語言庫函數中的內存操作函數memcpy()、memmove()、memset()、memcmp()使用示例分析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-09-09
  • openCV4.1.1+VS2019環(huán)境配置詳解

    openCV4.1.1+VS2019環(huán)境配置詳解

    這篇文章主要介紹了openCV4.1.1+VS2019環(huán)境配置詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08

最新評論