C言語,fileno()関数でストリームのファイル記述子を取得

スポンサーリンク

鍛錬 880

C言語,fileno()関数でストリームのファイル記述子を取得

fileno()関数を使用すると、ストリームのファイルディスクリプタを取得することができます。
 
以下は、fileno()関数についてです。

#include <stdio.h>

int fileno(FILE *stream);
 

引数

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

引数 意味
FILE *stream ストリーム

戻り値

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

戻り値
int ストリームが有効な場合 ストリームのファイルディスクリプタ
int ストリームが有効ではない場合 -1
スポンサーリンク

プログラム

以下は、ストリームのファイルディスクリプタを取得するプログラム、test_fileno.c です。

今回は、次のストリームを指定しています。

取得する順番 ストリーム
1回目 標準入力 (stdin)
2回目 標準出力 (stdout)
3回目 標準エラー出力 (stderr)
4回目 オープンしたファイル
// include
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// main
int main(void)
{
	char filename[256] = "";
	int stream_fd;
	int ret;
	FILE *fp;
	
	// ストリームのファイルディスクリプタを取得
	
	// 標準入力 -------------------------------------------
	stream_fd = fileno(stdin);
	if (stream_fd == -1) {
		perror("fileno");
		exit(EXIT_FAILURE);
	}
	printf("stdin --> %d\n", stream_fd);
	
	// 標準出力 -------------------------------------------
	stream_fd = fileno(stdout);
	if (stream_fd == -1) {
		perror("fileno");
		exit(EXIT_FAILURE);
	}
	printf("stdout --> %d\n", stream_fd);
	
	// 標準エラー出力 -------------------------------------
	stream_fd = fileno(stderr);
	if (stream_fd == -1) {
		perror("fileno");
		exit(EXIT_FAILURE);
	}
	printf("stderr --> %d\n", stream_fd);
	
	// ファイルのストリーム -------------------------------
	strncpy(filename, "sample.txt", sizeof(filename) - 1);
	fp = fopen(filename, "w");
	if (fp == NULL) {
		perror("fopen");
		exit(EXIT_FAILURE);
	}
	
	stream_fd = fileno(fp);
	if (stream_fd == -1) {
		perror("fileno");
		exit(EXIT_FAILURE);
	}
	printf("sample.txt --> %d\n", stream_fd);
	
	ret = fclose(fp);
	if (ret != 0) {
		perror("fclose");
		exit(EXIT_FAILURE);
	}
	
	return 0;
}
スポンサーリンク

実行結果

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

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra test_fileno.c -o test_fileno
***@ubuntu:~/***/test/c$ ./test_fileno
stdin --> 0
stdout --> 1
stderr --> 2
sample.txt --> 3

 
上記に示した通り、ストリームのファイルディスクリプタを取得することができました。

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