C言語,readlink()関数でシンボリックリンク先を取得する

スポンサーリンク

鍛錬 786

C言語,readlink()関数でシンボリックリンク先を取得する

シンボリックリンクのリンク先を取得するには、readlink()関数を使用します。
 
以下は、readlink()関数についてです。

#include <unistd.h>

ssize_t readlink(const char *pathname, char *buf, size_t bufsiz);
 

 
リンク先の取得時、ヌルバイト(‘\0’)は buf に格納されません。

引数

以下は、上記の引数についてです。

引数 意味
const char *pathname シンボリックリンク
char *buf 取得したリンク先が格納されるバッファ
size_t bufsiz buf のサイズ

戻り値

以下は、戻り値についてです。

戻り値
int 成功した場合 buf に格納されたバイト数
int エラーの場合 -1
スポンサーリンク

プログラム

以下は、シンボリックリンクのリンク先を取得するプログラム、test_readlink.c です。

今回は、シンボリックリンクを「SYM_LINK.txt」としています。

シンボリックリンク
SYM_LINK.txt
// include
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

// main
int main(void)
{
	char file_path[256] = "";
	char sl_path[256] = "";
	int len;
	
	// シンボリックリンクを格納
	strncpy(sl_path, "SYM_LINK.txt", sizeof(sl_path) - 1);
	
	// シンボリックリンクのリンク先を取得
	len = readlink(sl_path, file_path, sizeof(file_path) - 1);
	if (len == -1) {
		perror("readlink");
		exit(EXIT_FAILURE);
	}
	file_path[len] = '\0';
	
	printf("%s (シンボリックリンク)\n", sl_path);
	printf("%s (リンク先)\n", file_path);
	
	return 0;
}
スポンサーリンク

実行結果

以下は、プログラム test_readlink.c を実行しています。

dummy@ubuntu:/var/tmp/test$ 
dummy@ubuntu:/var/tmp/test$ ls -l
合計 8
-rw-r--r-- 1 dummy dummy   4 Mar 21 11:56 SRC.txt
lrwxrwxrwx 1 dummy dummy   7 Mar 21 11:57 SYM_LINK.txt -> SRC.txt
-rwxr-xr-x 1 dummy dummy 612 Mar 21 12:22 test_readlink.c
dummy@ubuntu:/var/tmp/test$ 
dummy@ubuntu:/var/tmp/test$ 
dummy@ubuntu:/var/tmp/test$ gcc -Wall -Wextra test_readlink.c -o test_readlink
dummy@ubuntu:/var/tmp/test$ ./test_readlink
SYM_LINK.txt (シンボリックリンク)
SRC.txt (リンク先)

 
上記に示した通り、シンボリックリンクのリンク先を取得することができました。

タイトルとURLをコピーしました