LINUX.ORG.RU

Как по уму собирать вывод порождённого процесса в GLib?

 , , , ,


1

1

В Qt есть QProcess, который умеет «сигналить», если дочерний процесс выводит что-либо на stdout. Как добиться схожего функционала, используя GLib/GIO? Теоретически, можно реализовать свой костыль, который будет периодически проверять состояние порождённого процесса и сигналить, если тому есть, что сказать. Но ведь наверняка же есть какие-то встроенные средства для этого?

https://developer.gnome.org/glib/stable/glib-Spawning-Processes.html#g-spawn-...

Потом делаешь как-нибудь так...

set_up_io_channel(stdout_fd, G_IO_IN|G_IO_PRI|G_IO_ERR|G_IO_HUP|G_IO_NVAL,iofunc_stdout, NULL);
  
set_up_io_channel(stderr_fd, G_IO_IN|G_IO_PRI|G_IO_ERR|G_IO_HUP|G_IO_NVAL,iofunc_stderr, NULL);

iofunc_stdout, iofunc_stderr - callback'и при выводе в соответствующие потоки

Dennis7 ()
Последнее исправление: Dennis7 (всего исправлений: 1)

Если правильно понял, нужно получить stdout дочернего процесса построчно. Асинхронным методом через DataInputSream и .get_stdout_pipe(). Примера в сети не могу пока найти, если вот отсюда понятно что-нибудь будет...

backbone ★★★★★ ()
Последнее исправление: backbone (всего исправлений: 2)

Silerus, Dennis7, backbone, благодарю, разобрался. Проще всего получилось через g_spawn_async_with_pipes() и добавление новых GIOChannel в основной контекст GMainLoop. Ещё в GIO есть GSubprocess, который может работать асинхронно, но это уже для сложных случаев.

Для будущих поколений оставлю вот эти статьи, очень помогли: http://blog.borovsak.si/

meliafaro ★★★★ ()
Ответ на: комментарий от meliafaro

Практически все работает, не считая пары устаревших функций.

Как давно это было...

gdk_threads_init has been deprecated since version 3.6

и весь дальнейший код бесполезен.

anonymous ()