使用带标志的execvp或execlp?

时间:2017-05-12 04:30:44

标签: c linux file-link

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

1 个答案:

答案 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