glib - spawn process & pipe

kratochvil jiri kratochvil na dbsystem.com
Středa Listopad 26 19:10:33 CET 2003


On Wed, Nov 26, 2003 at 05:14:22PM +0100, kratochvil jiri wrote:
> On Wed, Nov 26, 2003 at 03:21:44PM +0100, Jan Horák wrote:
> > Podivejte se na zdrojak 'qmail-start.c' ze zdrojaku qmailu z adesy 
> > http://www.qmail.org
> > QMail takhle komunikuje uplne porad a ma to reseny dost elegantne a 
> > spolehlive :-)
> 
> Diky, princip znam. Slo mi spis o to jestli to jde udelat pres funkce
> glib, nebo Jestli si to mam udelat primo pres sytemovy volani.

Takze mam reseni, kdyby to nekoho zajimalo tak je prilozen zdrojak, je
to trosku neucesane a neresi to uvolnovani resources, ale je naznacen
princip.

--
  KLoK

//////////////////////////////////////////////////////////
#include <glib.h>
#include <unistd.h>

char* (grab[]) = { "cdparanoia" , "-qZ", "1", "-", NULL};
char* (play[]) = { "play" , "-t wav", "-", NULL};

gint p[2];

void connect(gpointer data)
  {
  gint i = (gint)data;
  switch(i)
    {
  case 1:
    close(p[0]);
    dup2(p[1],1);
    break;
  case 2:
    close(p[1]);
    dup2(p[0],0);
    break;
  default:
    g_assert_not_reached();
    }
  }

int main()
  {
  //gint i,o;
  pipe(p);

  g_spawn_async_with_pipes(NULL,
      grab,
      NULL,
      (GSpawnFlags)(G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD),
      connect,
      (gpointer)1,
      NULL,
      NULL,
      NULL,
      NULL,
      NULL);

  g_spawn_async_with_pipes(NULL,
      play,
      NULL,
      (GSpawnFlags)(G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD),
      connect,
      (gpointer)2,
      NULL,
      NULL,
      NULL,
      NULL,
      NULL);
  
  g_main_loop_run (g_main_loop_new(g_main_context_default(),TRUE));
  }


Další informace o konferenci Linux