【发布时间】:2017-05-12 04:30:43
【问题描述】:
我正在尝试编写一个 C 程序来软链接 Unix 上的 2 个文件。在 Unix 中,这个命令是:
ln -s oldfile newlink
所以我编写了一个代码来创建一个char * 参数数组,如下所示:
char *args[4];
args[0] = "ln";
args[1] = "-s";
args[2] = argv[2]; //argv[2] is the name of the old file
args[3] = argv[3]; //argv[3] is the name of the new soft link file
execvp(args[0], args);
但是 Linux 处理器不读取 -s 标志。如何以处理 -s 标志的方式重写它?我也尝试使用execlp 来做到这一点:
execlp(args[0], args[0], args[1], args[2], args[3], NULL);
但这也行不通。我在这些方面做错了什么?
编辑:我也尝试了 symlink() 命令,但我认为我的 linux 版本不支持它,除非我错了并且我的代码存在缺陷:
char *args[4];
args[0] = "symlink";
args[1] = argv[2];
args[2] = argv[3];
args[3] = NULL;
execvp(args[0], args);
【问题讨论】:
-
对于
execvp(),你需要一个最终的NULL指针——所以你需要char *args[5];和args[4] = NULL;(或= 0)。execlp()几乎没问题;严格来说,你应该使用(char *)NULL作为最后一个参数。这在系统提供#define NULL 0而没有其他类型的 64 位机器上可能很重要。这是一个有效的空指针——但仅在已知需要空指针的上下文中,execlp()的参数列表不是这些上下文之一。 -
你怎么知道它没有被阅读?
-
请注意,
symlink不是命令(在您的 shell 中可用)。这是一个系统调用。 -
否:建议您使用
symlink()系统调用。if (symlink(argv[2], argv[3]) != 0) { …report error… }.