cxp (1.5.6) | 2003-11-14 19:45 |
cxpdd (0.1) | 2004-02-29 20:57 |
cxplorer-devel (2.1.0) | 2005-10-23 20:53 |
cxplorer-stable (2.0.0) | 2005-10-17 15:39 |
libcxp (0.5.6) | 2005-10-23 20:05 |
OriginalLastRelease (1.5.5) | 2003-09-25 00:03 |
PukiWiki2SFJPWiki (0.1) | 2009-05-09 01:14 |
http://www.gnome.gr.jp/docs/porting-apps-GNOME-2.0/ar01s19.htmlより
fork() と exec() を呼んでいる場合は、実行しないで下さい; 例えそれがちゃんと動作していても (私は貴方がいくつかの見えないエラー操作を実施していないことに賭けます)、確実に GLib の g_spawn_* 関数たちによる人目を引くエラー報告をしてません。これらの関数はさらに自動的にパイプを設定したり、コマンドの出力を文字列としてキャプチャしてくれます。
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);
#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; }
Glibとは関係ないが、system()を使う場合は、制御が戻るように注意。
system("cxplorer &")
&がないとプログラムが終了するまで制御が戻らなくなります。