如何在 C 中获取 xterm 的命令行参数?
How to get Command line arguments for xterm in C?
我的代码如下打开 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 我需要给它一个命令行参数来执行。如何进行?
运行 xterm -e ./paramax arg and more args
,直接或通过 exec 调用。
我认为您需要停止使用 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
VLA(可变长度数组)中为基本参数(基本 xterm
命令和参数)以及该程序的每个命令行参数分配足够的指针(程序名除外),最后的null加一。然后它将各种参数列表复制到 args
中,然后运行程序,如果无法执行命令则报告错误并以失败(非成功)状态退出。测试 execv()
中的 return 值没有意义;如果它 returned,它失败了,如果它成功,它没有 return。
请注意,我假设您的基本 execl()
命令成功执行了 xterm
,并且 xterm
成功运行了 ./paramax
程序,没有额外的参数。如果这不起作用,您将需要使用 base_args
选项列表,直到它起作用。然而,当我在 Linux (Ubuntu 14.04) 上使用仅包含 echo Hello World
的 shell 脚本 paramax
对其进行测试时,我得到了一个 xterm
其中显示 Hello World
。控件没有 return 到我 运行 的命令行,直到 xterm
(它取代了原来的程序)退出。您可以在 execv()
代码之前使用 fork()
来解决这个问题,只要您在子项中执行 execv()
并从父项中退出即可。
我的代码如下打开 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 我需要给它一个命令行参数来执行。如何进行?
运行 xterm -e ./paramax arg and more args
,直接或通过 exec 调用。
我认为您需要停止使用 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
VLA(可变长度数组)中为基本参数(基本 xterm
命令和参数)以及该程序的每个命令行参数分配足够的指针(程序名除外),最后的null加一。然后它将各种参数列表复制到 args
中,然后运行程序,如果无法执行命令则报告错误并以失败(非成功)状态退出。测试 execv()
中的 return 值没有意义;如果它 returned,它失败了,如果它成功,它没有 return。
请注意,我假设您的基本 execl()
命令成功执行了 xterm
,并且 xterm
成功运行了 ./paramax
程序,没有额外的参数。如果这不起作用,您将需要使用 base_args
选项列表,直到它起作用。然而,当我在 Linux (Ubuntu 14.04) 上使用仅包含 echo Hello World
的 shell 脚本 paramax
对其进行测试时,我得到了一个 xterm
其中显示 Hello World
。控件没有 return 到我 运行 的命令行,直到 xterm
(它取代了原来的程序)退出。您可以在 execv()
代码之前使用 fork()
来解决这个问题,只要您在子项中执行 execv()
并从父项中退出即可。