如何在xterm中获取命令行参数?

时间:2015-09-27 17:32:53

标签: c unix exec xterm

我的代码如下,打开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我需要给它一个命令行参数来执行它。如何处理?

2 个答案:

答案 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()并退出父代。