编写 C 代码以软链接 linux 上的 2 个文件
出于该特定目的,您无需/bin/ln
在 C 代码中启动进程。您应该改用symlink(2)系统调用(将由ln
进程使用);这更简单,更快。不要忘记检查它的成功。请注意,这symlink
是一个系统调用(即使是旧的 Linux 内核也应该有)作为C 函数,而不是命令(因此实际上你不能在 shell 中运行任何命令或可执行文件)。如文件所述,您需要在 C 源文件中。另请阅读symlink(7)。symlink
#include <unistd.h>
使用symlink
系统调用
例如,要执行与ln -s ~/somefile /tmp
您等效的操作,首先要计算对应于(通过使用...)的路径(例如,使用snprintf(3) ... ):~/somefile
getenv
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)系统调用/bin/ln
或某些exec(3)函数(将调用execve
),请务必明确添加一个NULL
指针。顺便说一句,这些exec
函数不会返回,因此您可能需要在之前调用fork(2)并在之后使用waitpid(2)。
请注意,execvp
使用PATH
变量. 因此,仅传递ln
给它可能会运行(如果您的用户有一个奇怪的设置)除了(在Linux FHS和 POSIX中指定该文件路径$PATH
)之外的其他东西,并具有一些意想不到的副作用。但请参阅environ(7)。/bin/ln
Linux 处理器不读取 -s 标志
不涉及“Linux 处理器”。该-s
标志由/bin/ln
可执行程序处理(其main
函数获取扩展的程序参数,然后调用symlink
系统调用)。您需要更多地了解 unix shell 的作用以及什么是通配符以及 shell 如何扩展命令。
有用的阅读参考
我建议阅读Advanced Linux Programming以及intro(2)和syscalls(2)手册页。
您可能应该阅读有关操作系统的更多信息,并了解命令和系统调用之间的区别以及任何Unix shell的作用。我建议阅读免费提供的操作系统:三个简单的部分