glib で command を実行

通常、commandを実行するときは、system()を使いますが、これだと実行ログ(標準出力など)が取れません。glibでは g_spawn_command_line_sync () があり、これを使うと標準出力と標準エラー出力が簡単に取得できます。

ということで、単純に wgetlame-3.98.4.tar.gz を sourceforge から取得してみます。

#include <glib.h>

int
main (int argc, char* argv[])
{
	gchar *command_line="wget http://jaist.dl.sourceforge.net/sourceforge/lame/lame-3.98.4.tar.gz";
	gchar *standard_output, *standard_error;
	gint exit_status;

	g_spawn_command_line_sync (command_line,
					&standard_output,
					&standard_error,
					&exit_status,
					NULL);
	g_printf ("stdout:\t%s\n", standard_output);
	g_printf ("stderr:\t%s\n", standard_error);
	return 0;
}

用意するのは command line 引数だけで、それ以外はポインタを渡します。GError はいつものように NULL にします。そして、ビルドと実行。

$ gcc main.c $(pkg-config --cflags --libs glib-2.0)
$ ./a.out
stdout:	
stderr:	--2010-11-07 17:25:21--  http://jaist.dl.sourceforge.net/sourceforge/lame/lame-3.98.4.tar.gz
jaist.dl.sourceforge.net (jaist.dl.sourceforge.net) をDNSに問いあわせています... 150.65.7.130, 2001:200:141:feed::feed
...
2010-11-07 17:25:27 (241 KB/s) - `lame-3.98.4.tar.gz' へ保存完了 [1336025/1336025]

こんな感じで簡単にプロセスを実行して、標準出力と標準エラー出力を取得することができます。