-2

我正在尝试编写一个 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);
4

1 回答 1

2

编写 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) ... ):~/somefilegetenv

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的作用。我建议阅读免费提供的操作系统:三个简单的部分

于 2017-05-12T04:35:53.010 回答