![](/img/trans.png)
[英]Using execlp system call with shell metacharacters in the arguments in C
[英]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。
這些函數的初始參數是要執行的文件的名稱。
execl()、execlp() 和 execle() 函數中的 const char *arg 和后續省略號可被視為 arg0、arg1、...、argn。 它們一起描述了一個或多個指向以空字符結尾的字符串的指針列表,這些字符串表示已執行程序可用的參數列表。 按照慣例,第一個參數應該指向與正在執行的文件關聯的文件名。
也就是說, execlp
的第一個參數是要運行的可執行文件。 第二個參數對應於傳遞給main
的argv[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.