symlink() - パス名へのシンボリック・リンクの作成

標準

標準/拡張機能 C/C++ 依存項目

POSIX.1a
XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

#define _POSIX1_SOURCE 2
#include <unistd.h>

int symlink(const char *pathname, const char *slink);

機能説明

pathname により指定されたファイルの slink で命名されたシンボリック・リンクを作成します。ファイル・アクセス検査は、ファイル pathname に対しては 実行されず、ファイルは存在している必要はありません。さらに、シンボリック・リンクはファイル・システム境界を 超えることができます。

シンボリック・リンクのパス名は、以下の方法で解決され ます。
  • パス名のコンポーネントで、ディレクトリーではなくシンボリック・リンク が参照される場合には、シンボリック・リンクに含まれるパス名が 解決されます。
  • シンボリック・リンクのパス名が / (スラッシュ) で開始 する場合には、シンボリック・リンクのパス名は、プロセス・ルート・ディレクトリーに応じて解決されます。

    シンボリック・リンクのパス名が / (スラッシュ) で開始 しない場合には、シンボリック・リンクのパス名は、シンボリック・リンクが含まれるディレクトリーに応じて 解決されます。

  • シンボリック・リンクがパス名の最後のコンポーネントの場合には、解決されることもあれば解決されないこともあります。解決されるかどうかは、パス名を使用する関数によって決まります。例えば、シンボリック・リンクが新旧どちらかのパス名の 最終コンポーネントとして表示される際には、rename() により、このシンボリック・リンクは解決されません。ただし、シンボリック・リンクが最後のコンポーネントとして表示されるときには、open により、このシンボリック・リンクが解決されます。
  • シンボリック・リンクがオリジナル・パス名の最後のコンポーネント ではない場合には、オリジナル・パス名の残りのコンポーネントが シンボリック・リンクに応じて解決されます。
  • / (スラッシュ) がパス名の最後のコンポーネントで、シンボリック・リンクがその前にある場合には、この シンボリック・リンクは常に解決されます。
シンボリック・リンクのモードは変更できないので、このモードは ルックアップ・プロセス時には無視されます。シンボリック・リンクにより参照されるファイルおよびディレクトリー はどれでも、アクセス許可について検査されます。

戻り値

正常に実行された場合、symlink() は 0 を戻します。

正常に実行されなかった場合、symlink() は -1 を戻して、名前を付けているどのファイルにも影響を及ぼさずに、errno を次のいずれかの値に設定します。

エラー・コード
説明
EACCES
slink パスの接頭部のコンポーネントにより、検索許可が 拒否されるか、または書き込み許可が、作成するシンボリック・リンク の親ディレクトリーで拒否されます。
EEXIST
slink によって指定されたファイルが既に存在します。
EINVAL
これは、次の理由のいずれかによって戻される場合があります。
  • pathname に NULL 文字があります。
  • slink に最後のコンポーネントとしてのスラッシュがあり、これは先行コンポーネントがディレクトリーになることを示しています。シンボリック・リンクをディレクトリーにすることはできません。
EIO
XPG4.2 の追加事項: ファイル・システムからの読み取り中に、入出力エラーが発生しました。
ELOOP
ループがシンボリック・リンクに存在しています。複数の POSIX_SYMLOOP シンボリック・リンクが、slink 引数の解析中に検出された場合に、このエラーが出されます。
ENAMETOOLONG
_POSIX_NO_TRUNC が有効ですが、pathnamePATH_MAX 文字より長いか、または pathname の一部のコンポーネントが NAME_MAX 文字より長くなっています。シンボリック・リンクの場合、シンボリック・リンクの代わりに使われる パス名のストリングの長さが PATH_MAX を超えています。PATH_MAX および NAME_MAX の値は、pathconf() を使用して判別できます。
ENOENT
XPG4.2 の追加事項: slink のコンポーネントが既存ファイルの名前を指定していないか、または slink が空ストリングです。
ENOSPC
シンボリック・リンクが入ることになるファイル・システム にスペースが残されていないので、新規のシンボリック・リンクを 作成できません。
ENOTDIR
slink のパス接頭部のコンポーネントがディレクトリーではありません。
EROFS
ファイル slink は、読み取り専用システムに常駐する ことはできません。

/* This example works only under z/OS XL C, not z/OS XL C++  */
#define _POSIX1_SOURCE 2
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

main() {
  char fn[]="test.file";
  char sln[]="test.symlink";
  int fd;

  if ((fd = creat(fn, S_IWUSR)) < 0)
    perror("creat() error");
  else {
    close(fd);
    puts("before symlink()");
    system("ls -il test.*");
    if (symlink(fn, sln) != 0) {
      perror("symlink() error");
      unlink(fn);
    }
    else {
      puts("after symlink()");
      system("ls -il test.*");
      unlink(fn);
      puts("after first unlink()");
      system("ls -il test.*");
      unlink(sln);
    }
  }
}
出力:
before symlink()
 4030 --w-------   1 MVSUSR1  SYS1     0 Apr 20 13:57 test.file

after symlink()
 4030 --w-------   1 MVSUSR1  SYS1     0 Apr 20 13:57 test.file
 4031 l---------   1 MVSUSR1  SYS1     9 Apr 20 13:57 test.symlink -> test.file
after first unlink()
 4031 l---------   1 MVSUSR1  SYS1     9 Apr 20 13:57 test.symlink -> test.file

関連情報