我们知道我们可以使用ln file1 file2
在Linux中创建硬链接,这会使file2
成为file1
的硬链接。
然而,当我尝试使用C程序时,我遇到了问题。下面是C代码。
#include<stdio.h>
#include<string.h>
#include<unistd.h>
int main(int argc, char *argv[])
{
if ((strcmp (argv[1],"ln")) == 0 )
{
char *myargs[4];
myargs[0] = "ln";
myargs[1] = argv[3];
myargs[2] = argv[4];
myargs[3] = NULL;
execvp(myargs[0], myargs);
printf("Unreachable code\n");
}
return 0;
}
用gcc编译这个程序之后我按如下方式运行它。
$ ./a.out ln file1 file2
ln: failed to access ‘file2’: No such file or directory
$
此处file1
存在且file2
是所需的硬链接。
任何人都可以指出我在哪里弄错了。
感谢。
答案 0 :(得分:9)
Shell脚本知识很少能很好地转移到C编程。这是您应该使用的man 2 link
:
NAME
link - make a new name for a file
SYNOPSIS
#include <unistd.h>
int link(const char *oldpath, const char *newpath);
使用C api代替外部shell工具的好处包括显着的性能提升和标志注入的消除。
答案 1 :(得分:2)
根据您显示的测试输入
$ ./a.out ln file1 file2
^ ^ ^ ^
| | | |
argv[0] ..[1] ..[2] ..[3]
代码
myargs[1] = argv[3];
myargs[2] = argv[4];
应该阅读
myargs[1] = argv[2];
myargs[2] = argv[3];
也就是说,在argv[n]
对argc
进行检查后,使用n+1
总是更好,更明智。