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.
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 |