我正在尝试编写一个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);
答案 0 :(得分:2)
将一个C代码写入linux上的软链接2文件
出于特定目的,您不需要在C代码中启动/bin/ln
进程。您应该使用symlink(2)系统调用(ln
进程将使用);这更简单,更快。不要忘记检查它的成功。请注意symlink
是一个system call(即使是旧的Linux内核也应该有)作为 C函数提供,而不是命令(所以你确实不能运行任何 {你的shell中有{1}} 命令或executable。如文档所述,您需要在C源文件中symlink
。另请阅读symlink(7)。
#include <unistd.h>
系统调用例如,为了完成symlink
的等效操作,您首先要计算与ln -s ~/somefile /tmp
对应的路径(例如使用snprintf(3) ...)(using getenv
... 。):
~/somefile
(我让你处理所有错误情况,包括char* somefilepath = "somefile";
char oldpathbuf[256];
snprintf(oldpathbuf, sizeof(pathbuf), "%s/%s", getenv("HOME"), somefilepath);
/// missing detecting and handling of errors in above
空间不足,这些很重要!)
然后你需要计算新链接的路径(你不能在目录上使用snprintf
系统调用):
symlink
(再次,处理错误,并考虑如果 char newpathbuf[256];
snprintf(newpathbuf, sizeof(newpathbuf), "/tmp/%s", somefilepath);
以somefilepath
开头会发生什么
最后,进行系统调用,但检查失败:
../
if (symlink(newpathbuf, oldpathbuf)) {
perror("symlink");
exit(EXIT_FAILURE);
}
程序如果你坚持(错误的恕我直言)使用/bin/ln
上的execve(2)系统调用或某些exec(3)函数(会调用/bin/ln
),请务必明确添加execve
指针。顺便提一下,这些NULL
功能无法返回,因此您可能需要先致电fork(2)并在之后使用waitpid(2)。
请注意exec
使用PATH
variable。因此,仅将execvp
传递给它可能会运行(如果您的用户有一个奇怪的ln
设置),而不是$PATH
(该文件路径在Linux FHS和POSIX中指定)有一些意想不到的副作用。但请参阅environ(7)。
Linux处理器不读取-s标志
没有&#34; Linux处理器&#34;参与其中。 /bin/ln
标志由-s
executable程序处理(其/bin/ln
函数获取扩展的程序参数,然后调用main
系统调用)。您需要了解更多unix shell的作用以及globbing是什么以及shell如何命令expanded。
我建议您阅读Advanced Linux Programming以及intro(2)和syscalls(2)手册页。
您可能应该阅读有关Operating Systems的更多信息,并了解命令和系统调用之间的区别以及任何Unix shell的角色。我建议您阅读免费提供的Operating Systems : Three Easy Pieces