Re: [Pgsql-ayuda] Llamada a programas externos desde postgres

From: Manuel Sugawara <masm(at)fciencias(dot)unam(dot)mx>
To: "Magnvs -- Carles Querol" <magnvsctv(at)hotmail(dot)com>
Cc: pgsql-ayuda(at)tlali(dot)iztacala(dot)unam(dot)mx
Subject: Re: [Pgsql-ayuda] Llamada a programas externos desde postgres
Date: 2004-01-26 19:50:38
Message-ID: m3ptd6xze9.fsf@conexa.fciencias.unam.mx
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

"Magnvs -- Carles Querol" <magnvsctv(at)hotmail(dot)com> writes:

> Hola a todos,
>
> Me he pasado la última semana rompiéndome la cabeza para escribir una
> función en C que llame a un procedimiento externo para poder generar
> documentos XML, pero no hay forma de que funcione.

Otra vez ... No uses execl ni ninguna de las llamadas de sistema de la
familia execve, a menos de que sepas lo que estas haciendo lo cual
*claramente* no es el caso. De la página del manual de execve

execve() no regresa en caso de éxito, y el código, datos, bss y la pila
del proceso invocador se reescriben con los correspondientes del pro-
grama cargado. El programa invocado hereda el PID del proceso invocador
y cualquier descriptor de fichero abierto que no se halla configurado
para "cerrar en ejecución" (close on exec). Las señales pendientes del
proceso invocador se limpian. Cualquier señal capturada por el proceso
invocador es devuelta a su comportamiento por defecto.

Si haces esto matas al postmaster y *realmente* no quieres hacer eso
(por ejemplo intenta exec clear desde tu shell). Otra vez, usa system
y tu función quedaría más o menos así (código sin probar!!!):

> 13 Datum
> 14 CridarExec (PG_FUNCTION_ARGS) {
> 15 int retornat;
> 16
> 17 text * path = PG_GETARG_TEXT_P(0);
> 18 text * args = PG_GETARG_TEXT_P(1);
> 19
> 20 size_t filename_len = VARSIZE(path)-VARHDRSZ;
> 21 size_t arguments_len = VARSIZE(args)-VARHDRSZ;
> 22
char *cmd = palloc(filename_len + arguments_len + 2);
memcpy(cmd, VARDATA(path), filename_len);
memcpy(cmd + filename_len, " ", 1);
memcpy(cmd + filename_len + 1, VARDATA(args), arguments_len);
*(cmd + filename_len + 1 + arguments_len) = '\0';
retornat = system(cmd);

> 40 PG_RETURN_INT32((int32)retornat);
> 41 }

Saludos,
Manuel.

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Magnvs -- Carles Querol 2004-01-26 19:54:52 Re: [Pgsql-ayuda] Llamada a programas externos desde postgres
Previous Message Martín Marqués 2004-01-26 19:27:31 Re: [Pgsql-ayuda] Llamada a programas externos desde postgres