link関数は、既存ファイルに対して、別名(ハード・リンク)を作成します。両方の名前は、全ての操作において完全に同じように使用できます。

リンクにはハード・リンクとシンボリック・リンク(又はソフト・リンク)があります。ハード・リンクはファイル・システムを超えて作成できませんし、ディレクトリに対しても作成できません。これに対して、シンボリック・リンクにはこれらの制限はありません。シンボリック・リンクに付いてはsymlink関数をご覧ください。

この関数は、C言語のライブラリ関数(標準関数)ではありませんので、コンパイラにより、使えない場合があります。

#include <unistd.h>
int link(const char *oldpath, const char *newpath);

*oldpathは既存ファイルをパス名で指定します。
*newpathは別名をパス名で指定します。

戻り値として、処理が成功した場合は0が、エラーの場合は-1を返します。

プログラム 例

#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv)
{
  int     return_code = 0;

  if (argc == 3) {
    /* ハード・リンクを作る */
    if (link(*(argv + 1), *(argv + 2)) == 0) {
      printf('%sを作成しました\n', *(argv + 2));
    }
    else {
      printf('%sを作成できませんでした\n');
      perror('');
      return_code = 1;
    }
  }
  else {
    printf('実行時引数の数が不当です\n');
    return_code = 2;
  }

  return return_code;
}

例の実行結果

$ cat temp_1.txt
Hello World!!.
Bye.
$ ls -l temp_1.txt ./DIR1/link_1.txt
ls: cannot access ./DIR1/link_1.txt: そのようなファイルやディレクトリはありません
-rw-r--r-- 1 user users 20 2008-07-04 09:03 temp_1.txt
$
$ ./link.exe temp_1.txt ./DIR1/link_1.txt
./DIR1/link_1.txtを作成しました
$
$ ls -l temp_1.txt ./DIR1/link_1.txt
-rw-r--r-- 2 user users 20 2008-07-04 09:03 ./DIR1/link_1.txt
-rw-r--r-- 2 user users 20 2008-07-04 09:03 temp_1.txt
$ cat ./DIR1/link_1.txt
Hello World!!.
Bye.
$
$ ls -ld ./DIR1 ./DIR2
drwxr-xr-x 2 merry users 4096 2008-08-11 16:10 ./DIR1
drwxr-xr-x 2 merry users 4096 2008-08-11 16:55 ./DIR2
$
$ ./link.exe ./DIR1 ./DIR2/DIR1_LINK
./DIR2/DIR1_LINKを作成できませんでした
Operation not permitted
$