Linux,open(システムコール)使用時の、ディスクリプタ

スポンサーリンク

鍛錬 202

Linux,open(システムコール)使用時の、ファイルディスクリプタ

Linux のシステムコール(低水準関数)である open を使用してファイルディスクリプタを作成した場合、未使用のファイルディスクリプタのうち、最も小さい値のディスクリプタが返されます。

つまり、プログラムの実行中に一度 close でファイルディスクリプタを破棄し、再度 open で作成する場合は、ファイルディスクリプタが再利用されます。

プログラム

以下は、ファイルディスクリプタが再利用されることを確認するプログラム open_descriptor.c です。

2 つ連続でファイルをオープンしてファイルディスクリプタの値を確認後、1 つ目にオープンしたファイルをクローズし、再度別のファイルをオープンすることにより、ファイルディスクリプタが再利用されることを確認しています。

// include
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

// main
int main(void)
{
	char filename_1[256] = "";
	char filename_2[256] = "";
	char filename_3[256] = "";
	int ret;
	int fd_1, fd_2, fd_3;
	
	strncpy(filename_1, "sample_1.txt", sizeof(filename_1) - 1);
	strncpy(filename_2, "sample_2.txt", sizeof(filename_2) - 1);
	strncpy(filename_3, "sample_3.txt", sizeof(filename_3) - 1);
	
	// オープン(1つ目)
	if ((fd_1 = open(filename_1,
					 O_RDWR | O_TRUNC | O_CREAT,
					 S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) == -1) {
		perror("open");
		return -1;
	}
	
	printf("----- 1つ目のファイルディスクリプタ -----\n");
	printf("%d\n", fd_1);
	
	// オープン(2つ目)
	if ((fd_2 = open(filename_2,
					 O_RDWR | O_TRUNC | O_CREAT,
					 S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) == -1) {
		perror("open");
		return -1;
	}
	
	printf("----- 2つ目のファイルディスクリプタ -----\n");
	printf("%d\n", fd_2);
	
	// クローズ(1つ目)
	if ((ret = close(fd_1)) == -1) {
		perror("close");
		return -1;
	}
	
	// オープン(3つ目)
	if ((fd_3 = open(filename_3,
					 O_RDWR | O_TRUNC | O_CREAT,
					 S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) == -1) {
		perror("open");
		return -1;
	}
	
	printf("----- 3つ目のファイルディスクリプタ -----\n");
	printf("%d\n", fd_3);
	
	// クローズ(2つ目)
	if ((ret = close(fd_2)) == -1) {
		perror("close");
		return -1;
	}
	
	// クローズ(3つ目)
	if ((ret = close(fd_3)) == -1) {
		perror("close");
		return -1;
	}
	
	return 0;
}

実行結果

以下は、上記のプログラム open_descriptor.c を実行し、ファイルディスクリプタが再利用されることを確認しています。

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra open_descriptor.c -o open_descriptor
***@ubuntu:~/***/test/c$ ./open_descriptor
----- 1つ目のファイルディスクリプタ -----
3
----- 2つ目のファイルディスクリプタ -----
4
----- 3つ目のファイルディスクリプタ -----
3

 
上記に示した通り、1 つ目と 3 つ目にオープンした際のファイルディスクリプタが同じであり、再利用されていることが分かります。

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