国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

linux的exec和system函數(shù)介紹及選擇

這篇具有很好參考價(jià)值的文章主要介紹了linux的exec和system函數(shù)介紹及選擇。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

在應(yīng)用程序中有時(shí)候需要調(diào)用第三方的應(yīng)用,這是常見的需求。此時(shí)可以使用linux下的exec命令或system命令達(dá)到目的。但是這兩個(gè)該選擇哪個(gè)呢?有什么區(qū)別?下面總結(jié)介紹下。

exec和system介紹

在Linux中,`exec`命令用于在當(dāng)前進(jìn)程中執(zhí)行一個(gè)新的程序。它會(huì)取代當(dāng)前進(jìn)程的內(nèi)容,并用新的程序來(lái)替換它。`exec`命令接受兩個(gè)參數(shù),第一個(gè)參數(shù)是要執(zhí)行的程序的路徑,第二個(gè)參數(shù)是一個(gè)字符串?dāng)?shù)組,用于傳遞給新程序的命令行參數(shù)。

`system`命令也用于在當(dāng)前進(jìn)程中執(zhí)行一個(gè)新的程序,但它是通過(guò)調(diào)用shell來(lái)實(shí)現(xiàn)的。`system`命令接受一個(gè)字符串參數(shù),該字符串包含要執(zhí)行的命令。它會(huì)創(chuàng)建一個(gè)新的shell進(jìn)程,并在該進(jìn)程中執(zhí)行指定的命令。

`exec`和`system`的主要區(qū)別在于它們的實(shí)現(xiàn)方式和用途。`exec`直接在當(dāng)前進(jìn)程中執(zhí)行一個(gè)新程序,而`system`通過(guò)調(diào)用shell來(lái)執(zhí)行命令。因此,`exec`更加高效,因?yàn)樗苊饬藙?chuàng)建新的進(jìn)程和shell的開銷。另外,`exec`通常用于在當(dāng)前進(jìn)程中執(zhí)行其他可執(zhí)行程序,而`system`則更適用于執(zhí)行shell命令和腳本。exec是一系列函數(shù)接口的總稱,其實(shí)分為多個(gè)函數(shù)接口版本。

exec族函數(shù):

       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 execvpe(const char *file, char *const argv[],char *const envp[]);

如何選擇

在Linux中,exec和system是兩個(gè)不同的命令,用于執(zhí)行外部程序。

exec是一個(gè)系統(tǒng)調(diào)用,它可以用來(lái)執(zhí)行一個(gè)新的程序,并替換當(dāng)前進(jìn)程的內(nèi)容。它需要提供一個(gè)可執(zhí)行文件的路徑以及命令行參數(shù),然后它會(huì)將當(dāng)前進(jìn)程替換為指定的程序。execvp命令是一個(gè)低級(jí)別的命令,它可以更好地控制執(zhí)行的過(guò)程,但是它不會(huì)創(chuàng)建新的進(jìn)程。

system是一個(gè)庫(kù)函數(shù),它可以用來(lái)執(zhí)行一個(gè)命令。它接收一個(gè)字符串參數(shù),該參數(shù)是要執(zhí)行的命令,然后它會(huì)創(chuàng)建一個(gè)新的進(jìn)程來(lái)執(zhí)行該命令。system命令是一個(gè)高級(jí)別的命令,它更簡(jiǎn)單易用,但是它的控制能力較弱。?

選擇使用exec還是system取決于你的需求。如果你需要更細(xì)粒度的控制可以使用exec。例如如果你需要替換當(dāng)前進(jìn)程的內(nèi)容,或者需要在子進(jìn)程中執(zhí)行一些特定的操作,那么exec可能更適合。另一方面,如果你只是簡(jiǎn)單地執(zhí)行一個(gè)命令,并希望獲得執(zhí)行結(jié)果,那么system可能更方便。

void set_gpio64_low(void)
{	
	system("echo 64 > /sys/class/gpio/export");
	system("echo out > /sys/class/gpio/gpio64/direction");
	system("echo 0 > /sys/class/gpio/gpio64/value");
}

`exec`命令的基本用法

#include <unistd.h>

int execvp(const char *file, char *const argv[]);

要執(zhí)行一個(gè)shell腳本,可以將shell解釋器的路徑作為第一個(gè)參數(shù),將腳本文件的路徑作為第二個(gè)參數(shù),并將其他參數(shù)作為字符串?dāng)?shù)組傳遞。

下面是一個(gè)示例,演示如何使用`execvp`命令執(zhí)行一個(gè)shell腳本:

#include <unistd.h>
#include <stdio.h>

int main() {
? ? char *const argv[] = {"./script.sh", NULL};
? ? execvp("/bin/sh", argv);
? ? printf("execvp failed\n");
? ? return 0;
}

在上面的示例中,`./script.sh`是要執(zhí)行的shell腳本的路徑。`/bin/sh`是shell解釋器的路徑。`NULL`表示參數(shù)數(shù)組的結(jié)束。

請(qǐng)注意,`execvp`命令執(zhí)行成功后,當(dāng)前進(jìn)程將被替換為新的程序,因此后續(xù)代碼不會(huì)被執(zhí)行。如果`execvp`命令執(zhí)行失敗,它將返回-1,并且可以使用`perror`函數(shù)打印錯(cuò)誤信息。

確保在執(zhí)行`execvp`命令之前,腳本文件具有執(zhí)行權(quán)限??梢允褂胉chmod`命令為腳本文件添加執(zhí)行權(quán)限。

`execvp`命令執(zhí)行成功后的當(dāng)前進(jìn)程將被替換為新的程序,后續(xù)代碼不會(huì)被執(zhí)行。如果想要在`execvp`命令執(zhí)行后繼續(xù)執(zhí)行代碼,可以使用`fork`函數(shù)創(chuàng)建一個(gè)子進(jìn)程,在子進(jìn)程中調(diào)用`execvp`命令,而父進(jìn)程則可以繼續(xù)執(zhí)行后續(xù)代碼。

下面是一個(gè)示例代碼:

#include <stdio.h>
#include <unistd.h>

int main() {
? ? pid_t pid = fork();
? ? if (pid == 0) {
? ? ? ? // 子進(jìn)程中執(zhí)行新的程序
? ? ? ? char *args[] = {"ls", "-l", NULL};
? ? ? ? execvp("ls", args);
? ? } else if (pid > 0) {
? ? ? ? // 父進(jìn)程中繼續(xù)執(zhí)行后續(xù)代碼
? ? ? ? printf("This is the parent process.\n");
? ? ? ? // 可以添加其他代碼
? ? } else {
? ? ? ? // fork失敗
? ? ? ? printf("Fork failed.\n");
? ? ? ? return 1;
? ? }

? ? return 0;
}

在上述代碼中,子進(jìn)程中調(diào)用了`execvp`命令來(lái)執(zhí)行`ls -l`命令,而父進(jìn)程則繼續(xù)執(zhí)行后續(xù)代碼。

如果你想在應(yīng)用程序中滿足條件時(shí)調(diào)用其他應(yīng)用程序,可以考慮使用fork和execvp的組合。使用fork創(chuàng)建一個(gè)子進(jìn)程,在子進(jìn)程中使用execvp執(zhí)行其他應(yīng)用程序,這樣可以避免替換當(dāng)前進(jìn)程,同時(shí)在父進(jìn)程中可以繼續(xù)執(zhí)行后續(xù)代碼。

system與execl的區(qū)別

system會(huì)新起一個(gè)子進(jìn)程來(lái)調(diào)用要執(zhí)行的命令。而exec只是用另一個(gè)新程序替換了當(dāng)前進(jìn)程的正文、數(shù)據(jù)、堆和棧段。

int system(const char * cmdstring){
    pid_t pid;
    int status;
    if(cmdstring == NULL){
        return (1);
    }
    if((pid = fork())<0){
        status = -1;
    }else if(pid == 0){
        execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);//底層就是execl
        exit(127); //子進(jìn)程正常執(zhí)行則不會(huì)執(zhí)行此語(yǔ)句
    }else{
     while(waitpid(pid, &status, 0) < 0){
          if(errno != EINTER){
              status = -1;
              break;
          }
     }
    }
    return status;
}

正確處理?execvp?函數(shù)調(diào)用錯(cuò)誤方案和相應(yīng)的輸出消息

需要注意的是,exec?系列函數(shù)只有在發(fā)生錯(cuò)誤時(shí)才會(huì)返回,所以要實(shí)現(xiàn)錯(cuò)誤檢查例程,并根據(jù)需要處理相應(yīng)的代碼路徑。
其中?execvp?在失敗時(shí)返回?-1,而且它還會(huì)設(shè)置?errno?變量。不過(guò)要注意,errno?應(yīng)該在函數(shù)調(diào)用前明確設(shè)置為 0,只有在給定的調(diào)用返回后才檢查該值。execvp?函數(shù)可以接受沒(méi)有斜線的文件名,這意味著文件是在?PATH?環(huán)境變量指定的目錄中搜索的。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
int main(void) {
    const char *args[] = { "vim", "/home/ben/tmp3.txt", NULL };
    execvp("vim", args);
    exit(EXIT_SUCCESS);
}

假設(shè)用戶需要?jiǎng)?chuàng)建一個(gè)新的進(jìn)程,并執(zhí)行給定的程序代碼,那么在這種情況下我們可以利用?fork?函數(shù)調(diào)用與?execvp?相結(jié)合。在這種情況下,我們可以利用?fork?函數(shù)調(diào)用與?execvp?相結(jié)合。fork?復(fù)制調(diào)用的進(jìn)程,并創(chuàng)建一個(gè)新的進(jìn)程,稱為-子進(jìn)程。在下面的例子中,我們實(shí)現(xiàn)了一個(gè)自定義函數(shù)包裝器來(lái)創(chuàng)建一個(gè)新的進(jìn)程并加載/執(zhí)行給定的程序代碼。注意,一旦創(chuàng)建了子進(jìn)程,它就會(huì)執(zhí)行不同的代碼,而父進(jìn)程則會(huì)等待,直到子進(jìn)程退出。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/wait.h>

pid_t spawnChild(const char* program, char** arg_list)
{
    pid_t ch_pid = fork();
    if (ch_pid == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    }
    if (ch_pid > 0) {
        printf("spawn child with pid - %d\n", ch_pid);
        return ch_pid;
    } else {
        execvp(program, arg_list);
        perror("execve");
        exit(EXIT_FAILURE);
    }
}

int main(void) {

    const char *args[] = { "vim", "/home/ben/tmp3.txt", NULL };
    pid_t child;
    int wstatus;
    child = spawnChild("vim", args);
    if (waitpid(child, &wstatus, WUNTRACED | WCONTINUED) == -1) {
        perror("waitpid");
        exit(EXIT_FAILURE);
    }
    exit(EXIT_SUCCESS);
}

其他資源

Linux -- system、.(source)、exec的區(qū)別_青椒*^_^*鳳爪爪的博客-CSDN博客

exec和system函數(shù)_execl system_Lawrence_121的博客-CSDN博客

Linux -- system、.(source)、exec的區(qū)別_青椒*^_^*鳳爪爪的博客-CSDN博客

exec族函數(shù)、system()函數(shù)和popen函數(shù)_exec函數(shù) system_基爾霍夫原來(lái)是碼農(nóng)的博客-CSDN博客?https://www.cnblogs.com/armsom/articles/17523386.html

Linux下對(duì)GPIO的操作控制(基于GPIO子系統(tǒng))_linux 通過(guò)按鈕控制gpio de_金城孤客的博客-CSDN博客?Linux系統(tǒng)應(yīng)用層GPIO控制_echo 268 > export增加gpio268_技術(shù)の宅的博客-CSDN博客文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-615096.html

到了這里,關(guān)于linux的exec和system函數(shù)介紹及選擇的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Qt應(yīng)用開發(fā)(基礎(chǔ)篇)——顏色選擇器 QColorDialog

    Qt應(yīng)用開發(fā)(基礎(chǔ)篇)——顏色選擇器 QColorDialog

    ???????? QColorDialog 類繼承于QDialog,是一個(gè)設(shè)計(jì)用來(lái)選擇顏色的對(duì)話框部件。 ????????對(duì)話框窗口 QDialog ???????? QColorDialog 顏色選擇器一般用來(lái)讓用戶選擇顏色,比如畫圖工具中選擇畫筆的顏色、刷子的顏色等。你可以使用靜態(tài)函數(shù) QColorDialog::getColor() 直接顯示對(duì)

    2024年02月10日
    瀏覽(51)
  • V3.0_用exec族函數(shù)替代system()

    V3.0_用exec族函數(shù)替代system()

    注意點(diǎn):exec族函數(shù)的使用 以execl為例: (1) ?(2)exec族函數(shù)中的函數(shù)調(diào)用失敗時(shí)會(huì)設(shè)置error并返回-1,然后從源程序調(diào)用點(diǎn)接著往下執(zhí)行。 執(zhí)行成功后不會(huì)返回,也不會(huì)從源程序調(diào)用點(diǎn)接著往下執(zhí)行。 exec族函數(shù)一般配合fork使用; 創(chuàng)建子進(jìn)程后,在子進(jìn)程中調(diào)用exec組函數(shù)

    2024年02月06日
    瀏覽(16)
  • Qt應(yīng)用開發(fā)(基礎(chǔ)篇)——文件選擇對(duì)話框 QFileDialog

    Qt應(yīng)用開發(fā)(基礎(chǔ)篇)——文件選擇對(duì)話框 QFileDialog

    ???????? QFileDialog 類繼承于 QDialog ,提供了一個(gè)允許用戶選擇文件或目錄的對(duì)話框。 ????????對(duì)話框窗口 QDialog ???????? QFileDialog 文件選擇對(duì)話框允許用戶在當(dāng)前文件系統(tǒng)中選擇一個(gè)或者多個(gè)文件或者文件路徑,使用靜態(tài)函數(shù)創(chuàng)建是很簡(jiǎn)便的方式,比如: ?????

    2024年02月09日
    瀏覽(100)
  • 【鴻蒙應(yīng)用ArkTS開發(fā)系列】- 選擇圖片、文件和拍照功能實(shí)現(xiàn)

    【鴻蒙應(yīng)用ArkTS開發(fā)系列】- 選擇圖片、文件和拍照功能實(shí)現(xiàn)

    在使用App的時(shí)候,我們經(jīng)常會(huì)在一些社交軟件中聊天時(shí)發(fā)一些圖片或者文件之類的多媒體文件,那在鴻蒙原生應(yīng)用中,我們?cè)趺撮_發(fā)這樣的功能呢? 本文會(huì)給大家對(duì)這個(gè)功能點(diǎn)進(jìn)行講解,我們采用的是拉起系統(tǒng)組件來(lái)進(jìn)行圖片、文件的選擇,拉起系統(tǒng)相機(jī)進(jìn)行拍照的這樣一種

    2024年02月04日
    瀏覽(23)
  • Flutter與Android開發(fā):構(gòu)建跨平臺(tái)移動(dòng)應(yīng)用的新選擇

    Flutter與Android開發(fā):構(gòu)建跨平臺(tái)移動(dòng)應(yīng)用的新選擇

    本文內(nèi)容提綱如下: 介紹Flutter技術(shù):Flutter是一種由Google推出的開源UI工具包,用于構(gòu)建高性能、跨平臺(tái)的移動(dòng)應(yīng)用。文章將介紹Flutter的基本概念、特點(diǎn)和優(yōu)勢(shì),包括其快速的開發(fā)速度、一致的用戶界面和豐富的UI組件庫(kù)等。 Flutter與Android開發(fā)的對(duì)比:文章將對(duì)比Flutter與傳統(tǒng)

    2023年04月21日
    瀏覽(1004)
  • C# 開發(fā)桌面應(yīng)用簡(jiǎn)單介紹

    C# 開發(fā)桌面應(yīng)用簡(jiǎn)單介紹

    一. C#使用場(chǎng)景介紹 C#是微軟公司發(fā)布的一種由C和C++衍生出來(lái)的面向?qū)ο蟮木幊陶Z(yǔ)言、運(yùn)行于.NET Framework和.NET Core(完全開源,跨平臺(tái))之上的高級(jí)程序設(shè)計(jì)語(yǔ)言。 二.?開發(fā)流程 1.?創(chuàng)建項(xiàng)目:打開Visual Studio后右側(cè)選擇“創(chuàng)建新項(xiàng)目”,然后選擇“C#?Windows窗體應(yīng)用”即可創(chuàng)建桌

    2024年02月05日
    瀏覽(17)
  • 【VisionMaster SDK開發(fā)】第三講 C#二次開發(fā)介紹及應(yīng)用案例

    【VisionMaster SDK開發(fā)】第三講 C#二次開發(fā)介紹及應(yīng)用案例

    VisionMaster(后簡(jiǎn)稱VM)作為一款功能強(qiáng)大的工業(yè)圖像算法平臺(tái),可對(duì)工業(yè)中遇到的各種圖像進(jìn)行處理,同時(shí)擁有性能強(qiáng)大的算子以及豐富的教學(xué)例程,作為圖像處理的通用平臺(tái)是非常不錯(cuò)的選擇。但Vision Master軟件依舊有不足,就是難以配置復(fù)雜或定制化的圖形界面,故需要結(jié)

    2024年02月05日
    瀏覽(31)
  • HarmonyOS 應(yīng)用開發(fā)之@Builder裝飾器:自定義構(gòu)建函數(shù)_harmony 構(gòu)件函數(shù)

    HarmonyOS 應(yīng)用開發(fā)之@Builder裝飾器:自定義構(gòu)建函數(shù)_harmony 構(gòu)件函數(shù)

    @Builder function overBuilder( KaTeX parse error: Can\\\'t use function \\\'$\\\' in math mode at position 49: …`overBuilder===$?{ .paramA1}`) HelloComponent({message: $$.paramA1}) } } } @Component struct HelloComponent { @Link message: string; build() { Row() { Text( HelloComponent===${this.message} ) } } } @Entry @Component struct Parent { @State label: string =

    2024年04月25日
    瀏覽(21)
  • 軟考高級(jí)系統(tǒng)架構(gòu)設(shè)計(jì)師系列論文九十九:論軟件開發(fā)平臺(tái)的選擇和應(yīng)用

    軟考高級(jí)系統(tǒng)架構(gòu)設(shè)計(jì)師系列之:面向構(gòu)件的軟件設(shè)計(jì),構(gòu)件平臺(tái)與典型架構(gòu) 本文從一個(gè)行業(yè)MIS系統(tǒng)的開發(fā)實(shí)踐,討論了軟件開發(fā)平臺(tái)的選擇和應(yīng)用。首先,作者從項(xiàng)目的實(shí)際情況確定了軟件開發(fā)平臺(tái)的一些原則:技術(shù)成熟兼一定先進(jìn)性、高效集成的開發(fā)工具、開方人員熟練

    2024年02月11日
    瀏覽(95)
  • 軟考高級(jí)系統(tǒng)架構(gòu)設(shè)計(jì)師系列論文九十八:論軟件開發(fā)平臺(tái)的選擇與應(yīng)用

    軟考高級(jí)系統(tǒng)架構(gòu)設(shè)計(jì)師系列之:面向構(gòu)件的軟件設(shè)計(jì),構(gòu)件平臺(tái)與典型架構(gòu) 本文討論選擇新軟件開發(fā)平臺(tái)用于重新開發(fā)銀行中間業(yè)務(wù)系統(tǒng)。銀行中間業(yè)務(wù)系統(tǒng)是指銀行通過(guò)與企事業(yè)單位、機(jī)關(guān)團(tuán)體的合作,為客戶提供金融服務(wù)的系統(tǒng)。X省農(nóng)行銀行的原中間業(yè)務(wù)系統(tǒng)軟件開

    2024年02月11日
    瀏覽(88)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包