試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

GUdevライブラリでGNU/Linuxシステム上のデバイス情報を取得する(ページ1/3)

GUdevというライブラリを用いると、GNU/Linuxシステム(OS)上のデバイスの各種情報を得ることができる。これは/dev/以下のデバイスファイルをシステムの状態に応じて動的に作成/削除するudevというツールのソースツリーに含まれるライブラリで、同様にudevのソースツリーに含まれ、デバイス情報にアクセスするために用いられるlibudevというライブラリの上位ライブラリとなっており、GObjectライブラリのオブジェクトシステム上で動作する(GObjectのオブジェクトシステムへのバインディングと言える)。
GObjectのオブジェクトシステム上でオブジェクト指向プログラミングを行うVala言語では、GUdevライブラリの機能をオブジェクト指向APIで(言語が持つオブジェクトシステムを通して)用いることができる。
(2010/9/15)libudevもGUdevもC言語のライブラリだが、GUdevをC言語で使う場合はGTK+やGStreamerなどと同様、GObjectライブラリのオブジェクトシステムをC言語から用いることになる。

使い方

まずはGUdev.Clientクラスのオブジェクトを作成する。これは情報を問い合わせるためのクライアントとして振舞い、「query_by_*」系のメンバ関数を用いて用途に合わせた情報を得る。例えばquery_by_device_file()は「/dev/devicename」形式のデバイスファイルの場所を引数に指定してそのデバイスに関する情報を得ることができる。
[引用]ファイル名: gudev-1.0.vapi より

namespace GUdev {
	[CCode (cheader_filename = "gudev/gudev.h")]
	public class Client : GLib.Object {
		[CCode (has_construct_function = false)]
		public Client ([CCode (array_length = false)] string[]? subsystems);
		public unowned GUdev.Device? query_by_device_file (string device_file);
		public unowned GUdev.Device? query_by_device_number (GUdev.DeviceType type, GUdev.DeviceNumber number);
		public GLib.List<GUdev.Device> query_by_subsystem (string? subsystem);
		public unowned GUdev.Device? query_by_subsystem_and_name (string subsystem, string name);
		public unowned GUdev.Device? query_by_sysfs_path (string sysfs_path);
		...

該当するデバイスの情報が得られなければnullが返り,得られた場合はGUdev.Device型のオブジェクト(への弱い参照)が得られる。
得られたオブジェクトからはメンバ関数を用いて中の情報を取り出すことができる。一部は「get_*」系のメンバ関数で文字列として得られるが、情報の多くはデバイスの種類によって異なる項目名とその値のペアから成り、これらは「get_property*」系メンバ関数を用いて項目名を指定することで値が得られ、末尾が「_as_[型名]」のメンバ関数(例:get_property_as_int())により任意の型で取り出すこともできる。
項目名はメンバ関数get_property_keys()で全て取り出すことが可能で、foreach構文と併用すると全ての項目とその値を簡単に取り出すことができる。
[引用]ファイル名: gudev-1.0.vapi より

	[CCode (cheader_filename = "gudev/gudev.h")]
	public class Device : GLib.Object {
		...
		public GUdev.DeviceNumber get_device_number ();
		public GUdev.DeviceType get_device_type ();
		public unowned string get_devtype ();
		public unowned string? get_driver ();
		public unowned string get_name ();
		public unowned string get_number ();
		public unowned GUdev.Device? get_parent ();
		public unowned GUdev.Device? get_parent_with_subsystem (string subsystem, string? devtype);
		public unowned string? get_property (string key);
		public bool get_property_as_boolean (string key);
		public double get_property_as_double (string key);
		public int get_property_as_int (string key);
		[CCode (array_length = false)]
		public unowned string?[] get_property_as_strv (string key);
		public uint64 get_property_as_uint64 (string key);
		[CCode (array_length = false, array_null_terminated = true)]
		public unowned string?[] get_property_keys ();
		...

GUdev.Clientオブジェクトのquery_by_subsystem()を用いると指定したサブシステム名(例:block,net,soundなど)のデバイスをリスト(GLib.List<GUdev.Device>)で得られる。引数がnullだと全てのサブシステムが対象となる。リストはforeach文を用いると個別のデバイスに対して簡単に処理ができる。
実際の例についてはページ2とページ3で扱う。

(「GUdevライブラリでGNU/Linuxシステム上のデバイス情報を取得する(ページ2/3)」に続く)

関連記事:

使用したバージョン:

  • Vala 0.9.8
  • GUdev 153