C言語,ttyname_r()関数で端末名を取得する

スポンサーリンク

鍛錬 807

C言語,ttyname_r()関数で端末名を取得する

ファイルディスクリプタがオープンしている端末のパスを取得するには、ttyname_r()関数を使用します。
 
以下は、ttyname_r()関数についてです。

#include <unistd.h>

int ttyname_r(int fd, char *buf, size_t buflen);
 

引数

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

引数 意味
int fd ファイルディスクリプタ
char *buf パスが格納されるバッファ
size_t buflen バッファのサイズ

戻り値

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

戻り値
int 成功した場合 0
int エラーの場合 エラー番号
 
スポンサーリンク

プログラム

以下は、ファイルディスクリプタがオープンしている端末のパスを取得するプログラム、test_ttyname.c です。

今回は、「/dev/pts/1」について確認しています。

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

// main
int main(void)
{
	char filename[256] = "";
	char tty_name[256] = "";
	int fd;
	int ret;
	
	// オープン
	strncpy(filename, "/dev/pts/1", sizeof(filename) - 1);
	if ((fd = open(filename, O_RDONLY)) == -1) {
		perror("open");
		exit(EXIT_FAILURE);
	}
	
	// ファイルディスクリプタがオープンしている端末名を取得
	ret = ttyname_r(fd, tty_name, sizeof(tty_name) - 1);
	if (ret != 0) {
		printf("ERROR,ttyname_r,ret=%d\n", ret);
		close(fd);
		exit(EXIT_FAILURE);
	}
	printf("fd(%d) --> %s\n", fd, tty_name);
	
	// クローズ
	if ((ret = close(fd)) == -1) {
		perror("close");
		exit(EXIT_FAILURE);
	}
	
	return 0;
}

実行結果

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

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra test_ttyname.c -o test_ttyname
***@ubuntu:~/***/test/c$ ./test_ttyname
fd(3) --> /dev/pts/1

 
上記に示した通り、ファイルディスクリプタがオープンしている端末のパスを取得することができました。

スポンサーリンク

シェアする

フォローする