2015-04-06 2 views
1

Мы знаем, что мы можем создать жесткую ссылку в Linux с помощью ln file1 file2, которая сделает file2 жесткой ссылкой file1.Как создать жесткую ссылку в Linux из программы C

Однако, когда я пытаюсь сделать это, используя программу на 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

[man 2 link] (http://linux.die.net/man/2/link) может быть полезен. – chrk

ответ

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.

+0

Спасибо. Донно, как я пропустил это! – sps

6

Знания оболочки Shell редко переносят хорошо на программирование на С. Вот man 2 link, которые вы должны использовать вместо:

NAME 
     link - make a new name for a file 

SYNOPSIS 
     #include <unistd.h> 

     int link(const char *oldpath, const char *newpath); 

Преимущество использования API C вместо внешних инструментов оболочек включают резкое увеличение производительности и устранение инъекции флага.

+0

Спасибо за помощь! – sps

+0

int linRet = link (argv [2], argv [3]); if (linkRet == 0) return 1; Файл * fp = fopen (argv [3], "r"); if (fp! = NULL) printf («hardlink% s для файла% s \ nthanks для справки, \ n", argv [3], argv [2]); – sps