我想你需要停止使用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 *'。然而,一个程序对于这种错误投票是不可能的。 –