如何从 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];
也就是说,在检查 argc
与 n+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 工具的好处包括显着提高性能和消除标志注入。
我们知道我们可以使用 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];
也就是说,在检查 argc
与 n+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 工具的好处包括显着提高性能和消除标志注入。