我的代码如下,打开xterm终端并运行./paramax可执行文件
#include <unistd.h>
#include <sys/ipc.h>
int main(int argc, char* argv[])
{
execl("/usr/bin/xterm", "/usr/bin/xterm", "-hold", "./paramax", (void*)NULL);
return 0;
}
现在的问题是./paramax我需要给它一个命令行参数来执行它。如何处理?
答案 0 :(得分:1)
直接或通过exec调用运行xterm -e ./paramax arg and more args
。
答案 1 :(得分:0)
我认为您需要停止使用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;
}
这为基本参数(基本args
命令和参数)的xterm
VLA(可变长度数组)分配了足够的指针,以及该程序的每个命令行参数(除了程序名称),加上一个最终的null。然后,它将各种参数列表复制到args
中,然后运行程序,如果它无法执行命令并以失败(非成功)状态退出,则报告错误。测试execv()
的返回值没有意义;如果它返回,则失败,如果成功,它就不会返回。
请注意,我假设您的基本execl()
命令成功执行xterm
并且xterm
成功运行./paramax
程序而没有额外的参数。如果这不起作用,您需要使用base_args
选项列表,直到它正常工作。但是,当我在Linux(Ubuntu 14.04)上使用仅包含paramax
的shell脚本echo Hello World
进行测试时,我显示了xterm
并显示了Hello World
。控制没有返回到我运行它的命令行,直到xterm
(替换原始程序)退出。您可以在fork()
代码之前使用execv()
进行修复,只要您在子代中执行execv()
并退出父代。