Noticias de empresas y economía digital

Tratar su código C como scripts C con C Cod

C Cod es un front end para C, C++, o compiladores objeto de C que le permite tratar C como un lenguaje más de scripting. C Cod viene con C Server Pages, que proporciona soporte para CGI para que usted pueda escribir aplicaciones Web en C o C++ y tenerlos automáticamente bajo demanda.

No hay paquetes de C Cod para Ubuntu, Fedora u openSUSE. Voy a construir desde el código fuente usando la versión 1.2.8 en un equipo de 64 bits con Fedora 9. Me encontré con un ligero tirón durante la compilación que se puede resolver mediante la adición de una opción para la posición independiente de código a su CFLAGS como se muestra a continuación. El código PIC tiene la ventaja de que puede ser cargado en distintos lugares de la memoria; lo que es útil para la compilación del código para las bibliotecas compartidas, ya que les permiten ser movidas cuando múltiples bibliotecas quieren la misma dirección.

 

$ tar xzvf /.../ccod-1.2.8.tar.gz
$ cd ./ccod-*/
$ ./configure
$ make
/usr/bin/ld: csp.o: relocation R_X86_64_32 against `a local symbol' can not be used
when making a shared object; recompile with -fPIC
csp.o: could not read symbols: Bad value

$ vi Makefile
PACKAG = ccod-1.2.8
LFLAGS = -shared -Wl,-soname,libcsp.so
CFLAGS = -O2 -fPIC
LIBSTA = *.a
$ make clean
$ make
$ sudo make install

Mi primer intento de utilizar ccod obtiene un segfault, como se muestra a continuación.

$ cat main1.c
#!/usr/bin/ccod
#pragma CCOD:script no

int main( int argc, char** argv )
{
    printf("hi there ");
    return 0;
}

$ chmod +x main1.c
$ ./main1.c
Segmentation fault

Excavando en esto, he encontrado que la función cksum() es la causa. Tras la experimentación, el siguiente cambio con el tamaño de la variable s parece solucionar la cuestión (o al menos ya no se estrelló).

$ gdb /usr/bin/ccod
(gdb) r main1.c
...
(gdb) bt
#0  0x0000000000404554 in cksum (path=0x10f3390
			"/home/ben/testing/ccod/hello-world.c") at ccod.c:1306
#1  0x000000000040441b in get_sourcesum () at ccod.c:1203
#2  0x0000000000409605 in main (in_argc=2, in_argv=0x7fff6008bcd8) at ccod.c:3398
(gdb) q

$ vi /home/ben/testing/ccod/hello-world.c
...
static unsigned long
cksum(const unsigned char *path)
{
//	register unsigned long  i, c, s = 0;
	register unsigned long  i, c = 0;
    int s = 0;
...
... recompile and reinstall ccod ...

$ ./main1.c
hi there

En el ejemplo anterior he usado ccod de una forma que deja su código fuente más próximo a lo que sería un nivel normal de lo que es un archivo de C. Así de simple, para aquellos programas sencillos sólo necesitarás añadirles las dos líneas de código en el código fuente para que puedan ser utilizados con ccod. La mayoría de los ejemplos en el sitio Web de ccod, utilizan una mezcla entre la sintaxis de C y la de PHP. Por ejemplo, en el siguiente archivo, el aviso de que ya no hay una función main(), y que cualquier texto que se encuentra fuera del bloque

$ cat ./main2.c
#!/usr/bin/ccod

hi there
<?
    printf("and more");
    return 0;
?>
$ chmod +x ./main2.c
$ ./main2.c
hi there
and more

La invasora sintaxis funciona bien si usted desea utilizar ccod Web con la programación web de C Server Pages. La documentaciónde la página enumera una pequeña colección de funciones que hacen que la programación CGI con C Server Pages sea bastante «pasable». Las funciones que uno espera para la programación Web, tales como la manipulación de sesiones, cookies, formularios, acceso a las cadena de consulta, y la redirección, están disponibles como funciones normales de C Server Page.

En el primer ejemplo he utilizado #pragma CCOD:script para modificar la forma ccod manejará el archivo de C de origen. El proyecto prevé cerca de una docena de tales pragmas, lo que le permite especificar qué compilador utilizar, que banderas (flags) invocar al compilador; con que bibliotecas adicionales podrá vincular el programa, y unas pocas opciones específicas para el C Server Page.

Como ccod crea una caché como si fueran binarios compilados, su código fuente no es compilado cada vez que lo ejecuta. Por supuesto, que mi pequeña función cksum no está completamente probada y puede romper la memoria caché. El problema parece ser que es la variable s que devolvía valores que eran demasiado grandes, por lo que se cambió el tipo de datos.

Si usted tiene un código en C o C++ y desea exponer parte de su funcionalidad a la web de prototipos, C Cod podría ser sólo el billete. Por la simplicidad de su código, compilar, ejecutar ciclos de prueba C Cod le puede ayudar a evitar siempre tener que crear makefiles o preocuparse por el proceso de compilación en absoluto.

Ben Martin ha estado trabajando en sistemas de ficheros más de 10 años. . Completó su doctorado y ahora ofrece servicios de consultoría, se centró en libferris, sistemas de archivos, y buscar soluciones.

Fuente: Linux.com, traducción Linux-Party.com

Publicaciones