我想你需要停止使用execl()
並開始使用execv()
代替:
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char* argv[])
{
char *base_args[] = { "/usr/bin/xterm", "-hold", "./paramax", };
enum { NUM_BASEARGS = sizeof(base_args)/sizeof(base_args[0]) };
char *args[NUM_BASEARGS + argc];
int i;
for (i = 0; i < NUM_BASEARGS; i++)
args[i] = base_args[i];
for (int j = 1; j < argc; j++)
args[i++] = argv[j];
args[i] = 0;
execv(args[0], args);
fprintf(stderr, "%s: failed to execute %s (%d: %s)\n",
argv[0], args[0], errno, strerror(errno));
return 1;
}
這種分配的基本參數(基本xterm
命令和參數的args
VLA(變長數組)的足夠的指點),加上這個程序的每個命令行參數(程序名除外),加上最後一個null。然後它將各種參數列表複製到args
中,然後運行該程序,如果它未能執行命令並以失敗(非成功)狀態退出則報告錯誤。從execv()
測試返回值沒有意義;如果它返回,則失敗,如果成功,則不會返回。
請注意,我假設你的基本execl()
命令成功執行xterm
,而且xterm
成功運行./paramax
程序,沒有額外的參數。如果這不起作用,則需要使用base_args
選項列表,直到它正常工作。但是,當我在包含echo Hello World
的shell腳本paramax
的Linux(Ubuntu 14.04)上對其進行測試時,我得到了一個xterm
,其中顯示了Hello World
。控制沒有返回到我運行它的命令行,直到xterm
(取代原來的程序)退出。你可以在execv()
代碼之前用fork()
來解決這個問題,只要你在孩子中做execv()
並退出父代。
請注意,'execl()'的最後一個參數應該是'(char *)NULL',而不是'(void *)NULL',因爲參數都是'char *'。然而,一個程序對於這種錯誤投票是不可能的。 –