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 $