Как создать жесткую ссылку в Linux из программы на C

Мы знаем, что можем создать жесткую ссылку в Linux, используя ln file1 file2, что сделает 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 — это желаемая жесткая ссылка.

Может ли кто-нибудь указать, где я сделал ошибку здесь.

Спасибо.


person sps    schedule 06.04.2015    source источник
comment
ссылка man 2 может быть полезной.   -  person chrk    schedule 06.04.2015


Ответы (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.

person Sourav Ghosh    schedule 06.04.2015
comment
Спасибо. Донно, как я пропустил это! - person sps; 06.04.2015

Знание сценариев оболочки редко хорошо переносится в программирование на 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 вместо внешних инструментов оболочки включают в себя резкое повышение производительности и устранение внедрения флагов.

person that other guy    schedule 06.04.2015
comment
int linRet = ссылка (argv[2], argv[3]); если (linkRet==0) вернуть 1 ; Файл *fp = fopen (argv[3], r); if (fp != NULL) printf ( жесткая ссылка %s для файла %s \nспасибо за помощь,\n,argv[3],argv[2]); - person sps; 07.04.2015