symlink() - パス名へのシンボリック・リンクの作成
規格
| 標準/拡張機能 | C/C++ | 依存項目 |
|---|---|---|
POSIX.1a
XPG4.2 Single UNIX Specification、バージョン 3 |
both |
Format
#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 文字があります。
- EIO
- XPG4.2 に追加されたもの ファイル・システムからの読み取り中に入出力エラーが発生しました。
- ELOOP
- ループがシンボリック・リンクに存在しています。 複数の POSIX_SYMLOOP シンボリック・リンクが、slink 引数の解析中に検出された場合に、このエラーが出されます。
- ENAMETOOLONG
- _POSIX_NO_TRUNC が有効ですが、pathname が PATH_MAX 文字より長いか、または pathname の一部のコンポーネントが NAME_MAX 文字より長くなっています。 シンボリック・リンクの場合、シンボリック・リンクを置換するパス名ストリングの長さが PATH_MAX を超えています。 PATH_MAX および NAME_MAX の値は、pathconf() を使用して判別できます。
- ENOENT
- XPG4.2 に追加されたもの スリンク のコンポーネントが既存のファイル名を指定していないか、 スリンク が空ストリングです。
- 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