symlinkはシンボリックリンクを作成する。
Man page of SYMLINK
シンボリックリンクが指し示すファイルパス、そしてシンボリックリンク名を指定する。
成功すると0が返る。
$ pwd
/home/bg1/project/cloud/github.com/Sample/unixsyscall/symlink/symlink/src/symlink
$ vi symlink.c
$ mkdir test1
$ cd test1/
$ vi test1.txt
$ cat test1.txt
ABCDE
$
まずは、ディレクトリtest1を作成し、その下にtest1.txtを作成し、文字列を書いておく。
$ cd ..
$ ls
symlink.c test1
$ gcc symlink.c -o symlink
$ ls
symlink symlink.c test1
$ ./symlink
create test1_symlink success!
$ ls
symlink symlink.c test1 test1_symlink
$
上がってコンパイルしてsymlinkでシンボリックリンクtest1_symlinkを作成。
$ ls -al
合計 36
drwxrwxr-x. 3 bg1 bg1 4096 9月 29 07:19 .
drwxrwxr-x. 3 bg1 bg1 4096 9月 29 07:04 ..
-rwxrwxr-x. 1 bg1 bg1 18440 9月 29 07:18 symlink
-rw-rw-r--. 1 bg1 bg1 856 9月 29 07:16 symlink.c
drwxrwxr-x. 2 bg1 bg1 4096 9月 29 07:18 test1
lrwxrwxrwx. 1 bg1 bg1 15 9月 29 07:19 test1_symlink -> test1/test1.txt
$ cat test1_symlink
ABCDE
$ vi test1_symlink
$ cat test1_symlink
ABCDE
XYZ
$ cat test1/test1.txt
ABCDE
XYZ
$
test1_symlinkがtest1/test1.txtを指しているのがわかるので、test1_symlink側を修正しても、test1/test1.txt側に反映されている。
$ mkdir test2
$ ls
symlink symlink.c test1 test1_symlink test2
$ mv test1/test1.txt test2/test1.txt
$ ls test2/
test1.txt
$ cat test1_symlink
cat: test1_symlink: No such file or directory
$ ls -al
合計 40
drwxrwxr-x. 4 bg1 bg1 4096 9月 29 07:22 .
drwxrwxr-x. 3 bg1 bg1 4096 9月 29 07:04 ..
-rwxrwxr-x. 1 bg1 bg1 18440 9月 29 07:18 symlink
-rw-rw-r--. 1 bg1 bg1 856 9月 29 07:16 symlink.c
drwxrwxr-x. 2 bg1 bg1 4096 9月 29 07:22 test1
lrwxrwxrwx. 1 bg1 bg1 15 9月 29 07:19 test1_symlink -> test1/test1.txt
drwxrwxr-x. 2 bg1 bg1 4096 9月 29 07:22 test2
$
ディレクトリtest2を作成して、そこにtest1.txtを移動すると、test1_symlinkにアクセスしようとしても、実体であるtest1.txtが存在しないのでエラーになる。
シンボリックリンクは実体を指さないので、リンク先はそのままである。
Sample/unixsyscall/symlink/symlink/src/symlink at master · bg1bgst333/Sample · GitHub