| 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 &")
&がないとプログラムが終了するまで制御が戻らなくなります。