gpt4 book ai didi

c - 使用带有标志的 execvp 或 execlp 吗?

转载 作者:行者123 更新时间:2023-11-30 20:10:39 26 4
gpt4 key购买 nike

我正在尝试编写一个 C 程序来软链接(soft link) 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);

最佳答案

write a C code to soft-link 2 files on linux

为了该特定目的,您不需要启动 /bin/ln在您的 C 代码中进行处理。您应该使用 symlink(2)系统调用(将由 ln 进程使用);这更简单,也更快。不要忘记检查其是否成功。请注意 symlinksystem call (即使是旧的 Linux 内核也应该有)作为 C 函数,而不是命令(所以实际上你不能运行任何 symlink 命令或 shell 中的 executable)。根据记录,您需要#include <unistd.h>在你的 C 源文件中。另请阅读symlink(7) .

使用symlink系统调用

例如,执行相当于 ln -s ~/somefile /tmp 的操作您首先需要计算对应于 ~/somefile 的路径(例如使用 snprintf(3) ...) (作者 using 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 variable 。所以就这样过去了ln它可能会运行(如果您的用户有一个奇怪的 $PATH 设置)除 /bin/ln 之外的其他东西(该文件路径在 Linux FHS 和 POSIX 中指定)会产生一些意想不到的副作用。但请参阅environ(7) .

the -s flag is not read by the Linux processor

不涉及“Linux 处理器”。 -s标志由 /bin/ln 处理executable程序(其 main 函数获取扩展的程序参数,然后调用 symlink 系统调用)。你需要了解更多unix shell的作用和什么globbing命令是什么以及命令是怎样的expanded通过外壳。

有用的阅读引用

我建议阅读Advanced Linux Programmingintro(2)syscalls(2)手册页。

您可能应该阅读有关 Operating Systems 的更多信息并了解命令和系统调用的区别以及各自的作用Unix shell 。我建议阅读免费提供的 Operating Systems : Three Easy Pieces

关于c - 使用带有标志的 execvp 或 execlp 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43929328/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com