C言語システムコール-link

linkシステムコール

概要

linkはファイルのハードリンクを作成します。

lnコマンド内部ではlinkシステムコールが使用されています。


ハードリンクとは、ファイルやディレクトリを別のパスで参照可能とする、UNIX系OSのファイルシステムの機能です。

UNIX系OSのファイルシステムでは、データ本体を格納する領域とは別に、各ファイルやディレクトリについて「Iノード」データが作成されます。

Iノードはファイル情報(サイズや作成日など)が格納されており、データ領域のどの位置にファイルデータが記録を表すポインタ情報も記録されます。

同じファイル実体を指す複数のIノードを作成し、それぞれ別のパスを設定する機能がハードリンクです。


UNIXのディレクトリは、3種類のハードリンクで参照されています。

例えば「tmp」ディレクトリに対して、以下3つのハードリンクが作成されます。

  • 親ディレクトリからそのディレクトリを参照するためにつけられた「tmp」という名前
  • そのディレクトリから自分自身を参照するためにつけられた「.」という名前
  • 子ディレクトリからそのディレクトリを参照するためにつけられた「..」という名前

ハードリンクを使用することで、ファイル自体を複製することなく別のパスを設定することができ、ディスクの有効利用や管理の手間の軽減が可能となります。

ただし、ハードリンクはデバイスやファイルシステムにまたがってリンクを作ることはできません。


ハードリンクが使用できない場合には、シンボリックリンクを利用します。

なお、ハードリンクでは実体ファイルデータを削除することができますが、シンボリックリンクでは実体を削除することはできません。



サンプルプログラム


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

int
main(void)
{
    int rc = 0;

    rc = link("./tmp/memo1.txt", "./tmp/memo2.txt");
    if(rc < 0){
        printf("Error: link(%d) %s\n", errno, strerror(errno));
        return(-1);
    }

    return(0);
}

実行


$ ls -la
...
-rw-r-----   1 user1  staff     9  9 12 15:49 memo1.txt
$./bin_link
$ ls -la
...
-rw-r-----   2 user1  staff     9  9 12 15:49 memo1.txt
-rw-r-----   2 user1  staff     9  9 12 15:49 memo2.txt

関連ページ