簡體   English   中英

使用“execlp”系統調用遞歸運行當前程序

[英]Using 'execlp' System Call to run current program recursively

我正在嘗試使用 execlp 在我的程序(對於一個項目)中調用我的程序並且遇到了麻煩。 我創建了一個示例項目,它應該從n倒數到 0(基本上運行 n 次)。 每次我運行它時,我都會得到第一次遞減,然后出現段錯誤。 請讓我知道我在這里做錯了什么。

PS 對 C 中的系統調用相當陌生,因此請盡可能詳細解釋。 提前致謝!

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

int main(int argc, char **argv)
{

    int n = atoi(argv[1]);

    char newParameters[2];
    sprintf(newParameters, "%d", n - 1);

    if (n != 0)
    {
        execlp("./tmp", newParameters, (char *)NULL);
    }

    printf("The program has finished.\n");

    return 0;
}

C 程序稱為 tmp。

execlp 手冊

這些函數的初始參數是要執行的文件的名稱。

execl()、execlp() 和 execle() 函數中的 const char *arg 和后續省略號可被視為 arg0、arg1、...、argn。 它們一起描述了一個或多個指向以空字符結尾的字符串的指針列表,這些字符串表示已執行程序可用的參數列表。 按照慣例,第一個參數應該指向與正在執行的文件關聯的文件名。

也就是說, execlp的第一個參數是要運行的可執行文件。 第二個參數對應於傳遞給mainargv[0] 第三個參數是argv[1]等等。 所以這種情況下的execlp需要是:

execlp("./tmp", "./tmp", newParameters, NULL);

或者最好還是使用argv[0]而不是硬編碼的可執行文件名,這樣無論程序如何鏈接它都可以工作:

execlp(argv[0], argv[0], newParameters, NULL);

其他需要注意的事項:

  • newParameters只能包含單個字符串(包括 NUL 終止符)。 所以任何數字大於 9 的命令行都會導致未定義的行為。
  • 其他良好做法:在使用argv值之前始終檢查argc並始終檢查所有 function 調用的返回值,在這種情況下特別是execlp

execlp(2)不能用於遞歸運行程序,因為沒有創建新進程。 當前上下文(進程地址空間、數據等)被新映射加載(覆蓋)以再次執行相同的程序,並且數據段、堆棧和 memory 段被分離並丟棄以創建新的。 當這個實例最終exit(2)時,沒有進程備份返回。 要創建一個新進程,您需要使用fork(2) ,而不是execlp(2)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM