如何从C程序在Linux中创建硬链接

时间:2015-04-06 20:41:25

标签: c linux execvp hardlink

我们知道我们可以使用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是所需的硬链接。

任何人都可以指出我在哪里弄错了。

感谢。

2 个答案:

答案 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总是更好,更明智。