symlink

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