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

How to create hard link in Linux from a C program

我们知道我们可以使用 ln file1 file2 在 Linux 中创建硬 link,这将使 file2 成为 file1 的硬 link。

但是,当我尝试使用 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 是所需的硬 link。

谁能指出我哪里出错了。

谢谢。

根据您显示的测试输入

$ ./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];

也就是说,在检查 argcn+1 之后使用 argv[n] 总是更好和明智的做法。

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 工具的好处包括显着提高性能和消除标志注入。