Glib2の利用

http://www.gnome.gr.jp/docs/porting-apps-GNOME-2.0/ar01s19.htmlより

子プロセスの生成

fork() と exec() を呼んでいる場合は、実行しないで下さい; 例えそれがちゃんと動作していても (私は貴方がいくつかの見えないエラー操作を実施していないことに賭けます)、確実に GLib の g_spawn_* 関数たちによる人目を引くエラー報告をしてません。これらの関数はさらに自動的にパイプを設定したり、コマンドの出力を文字列としてキャプチャしてくれます。

Spawning Processes

http://developer.gnome.org/doc/API/2.0/glib/glib-Spawning-Processes.html

 	GError *err = NULL;
 	
 	g_spawn_command_line_async("cxplorer", &err);
 	
 	g_error_free(err);

g_spawn_async_with_pipes()を使ってみる

 #include <glib.h>
 #include <sys/types.h>
 #include <sys/wait.h>
 
 int main (int argc, char **argv)
 {
 	gchar *cmd;
 	gchar **args;
 	gint sout;
 	gint pstat;
 	GPid pid;
 	GIOChannel *channel;
 	GString *str;
 	GIOStatus status;
 
 	g_assert (argc == 2);
 
 	cmd = g_strdup_printf ("tar -tzf '%s'", argv[1]);
 	g_shell_parse_argv (cmd, NULL, &args, NULL);
 
 	if(g_spawn_async_with_pipes (NULL, args, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, &pid, NULL, &sout, NULL, NULL))
 	{
 		channel = g_io_channel_unix_new (sout);
 		str = g_string_new ("");
 		while(g_io_channel_read_line_string (channel, str, NULL, NULL) == G_IO_STATUS_NORMAL)
 		{
 			g_print (str->str);
 		}
 		g_io_channel_shutdown (channel, FALSE, NULL);
 		g_io_channel_unref (channel);
 		g_string_free (str, TRUE);
 		g_spawn_close_pid (pid);
 	}
 
 	g_strfreev (args);
 	g_free (cmd);
 
 	return 0;
 }

system()

Glibとは関係ないが、system()を使う場合は、制御が戻るように注意。

 system("cxplorer &")

&がないとプログラムが終了するまで制御が戻らなくなります。