jueves, 29 de julio de 2010

Colores en printf

Se puede imprimir en la pantalla en colores al usar la funcion printf (....) como se muestra en este ejemplo:

/*********color_printf.c*************/
#include < stdio.h >
int main ()
{
printf ("\033[30m Salida en color: Negro\n");
printf ("\033[31m Salida en color: Rojo\n");
printf ("\033[32m Salida en color: Verde\n");
printf ("\033[33m Salida en color: Amarillo\n");
printf ("\033[34m Salida en color: Azul\n");
return 0;
}
/************************************/
Compilacion:
gcc -Wall -o color_printf color_printf.c
Salida en pantalla:

Salida en color: Negro
Salida en color: Rojo
Salida en color: Verde
Salida en color: Amarillo
Salida en color: Azul

domingo, 25 de julio de 2010

The UNIX® System

Si quiere conocer mas acerca de los sistemas operativos UNIX , puede visitar el sitio http://www.unix.org donde encontrara mucha informacion de sus especificaciones e historia

Matar Procesos

Un ejemplo en C de como matar procesos usando para ello la llamada al sistema int system(const char *string); que permite la ejecucion de una orden del interprete de comandos (shell).
Para mas informacion sobre esta funcion en su manual " man system " o si quiere este manual en castellano " man -L es system ".

/********matar_proceso.c********/
#include < stdio.h >
#include < string.h >
#include < stdlib.h >

int main(int argc, char **argv)
{
char *tmpStr;
int i,len,lenB;
char *Kill="kill -9 ";
char *killtotal=NULL;

for (i = 0; i < argc; i++)
{
tmpStr = argv[i];
if ( (strcmp(tmpStr,"-h")==0)||(strcmp(tmpStr,"--help")==0) ||\
(strcmp(tmpStr,"--usage")==0)||(strcmp(tmpStr,"-help")==0) || argc==1)
{
printf("\n");
printf("Usar: matar_proceso --pid IDPROCESO \n");
printf(" --help\n");
printf(" --version Version\n");
printf(" --pid\n");
printf("\n");
exit(0);
}

if((strcmp(tmpStr,"--pid")==0))
{
len=strlen(argv[i+1]);
lenB=strlen(Kill);
killtotal=(char*)malloc(len+lenB);
memset(killtotal,'\0',(len+lenB));
strcpy(killtotal,Kill);
strcat(killtotal,argv[i+1]);
}
if((strcmp(tmpStr,"--version")==0))
{
printf("0.1\n");
exit(0);
}
}
if(killtotal!=NULL)
{
printf("Matando el proceso --> %s\n",killtotal);
system(killtotal);
free(killtotal);
}
return 1;
}


/********************/
Compilacion:
gcc -Wall -O2 -o matar_proceso matar_proceso.c

jueves, 22 de julio de 2010

Manejo de colores y fuentes en Xlib

El manejo de colores y de fuentes en Xlib puede ser algo confuso o complejo para algunos que recien comienzan a programar unsando las librerias base del Xserver las Xlib.
En este ejemplo se muestra como crear una ventana y luego en ella colocar texto con un tamaño y color determinado.

/**********x11_1.c*************/

#include < X11/Xlib.h >
#include < X11/Xutil.h >
#include < stdio.h >
#include < string.h >

/*
Retorna el color mas proximo del mapa de colores
*/
unsigned long Buscar_color_nombre( Display *display, char *Nombre )
{
XColor color, temp;
XAllocNamedColor( display,DefaultColormap(display,DefaultScreen(display)),Nombre, &color, &temp );
return color.pixel;
}


int main()
{
Display *display;
Window window;
GC gc;
Font fuente;
char *Texto1 = "Test: Fuentes en Xlib";
char *Texto2 = "Color Rojo";
char *Texto3 = "Color Verde";

display = XOpenDisplay( NULL );
window = XCreateSimpleWindow( display,DefaultRootWindow( display ),100, 100, 300, 200, 1, 0, 1 );
XMapWindow( display, window );

gc = XCreateGC( display, window, 0, NULL );
fuente = XLoadFont( display, "9x15" );
XSetForeground(display, gc, Buscar_color_nombre(display, "white"));
XSetFont( display, gc, fuente );
XDrawString( display, window, gc, 10, 50, Texto1, strlen(Texto1) );
XSetForeground(display, gc, Buscar_color_nombre(display, "red"));
XDrawString( display, window, gc, 10, 80, Texto2, strlen(Texto2) );
XSetForeground(display, gc, Buscar_color_nombre(display, "green"));
XDrawString( display, window, gc, 10, 110, Texto3, strlen(Texto3) );

XFlush( display );
getchar();
}


/******************************/
Compilacion:
gcc -o x11_1 x11_1.c -lX11

miércoles, 21 de julio de 2010

Señales en C

Un pequeño programa que implementa el manejo de señales en c en base a estructuras y punteros.

/**********signal_c.c**************/
#include

struct Punteros_a_Funciones{
void (*leer)();
};
typedef struct Punteros_a_Funciones puntero_a_func;
typedef void* data;
#define VOID_POINTER (void*)
#define SIGNAL_FUC(f) ((SignalFunc)f)
typedef void (*SignalFunc) (void);

void signal_1()
{
printf("signal_1\n");
}

void signal_2()
{
printf("signal_2\n");
}
puntero_a_func Pasando_punteros(SignalFunc funci)
{
puntero_a_func puntero = { SIGNAL_FUC(funci)};
return puntero;
}
int main()
{
puntero_a_func Voides;
SignalFunc funci;

funci=signal_1;
Voides = Pasando_punteros(funci);
Voides.leer();

funci=signal_2;
Voides = Pasando_punteros(funci);
Voides.leer();
return 0;
}

/**********************************/
Compilacion:
gcc -o signal_c signal_c.c

domingo, 18 de julio de 2010

Modificar la posicion en pantalla de una aplicacion X en ejecucion

Se puede modificar algunos parametros de una aplicacion X en ejecucion para ello solo es necesario conocer la ID de esa aplicacion. El programa xwininfo nos puede ayudar para este proposito (lease su manual --> man xwininfo) su modo de uso es el siguiente.
Al ejecutar en consola el xwininfo este cambiara el cursor a una forma de cruz lo que nos indica que debemos seleccionar la aplicacion X que queremos saber sus propiedades, solo haga crick en la ventana de la aplicacion y xwininfo mostrara una salida como la siguiente:
------------------------
xwininfo: Please select the window about which you
would like information by clicking the
mouse in that window.

xwininfo: Window id: 0x1a0000d "xterm"

Absolute upper-left X: 5
Absolute upper-left Y: 25
Relative upper-left X: 0
Relative upper-left Y: 0
Width: 501
Height: 316
Depth: 16
Visual Class: TrueColor
Border width: 0
Class: InputOutput
Colormap: 0x20 (installed)
Bit Gravity State: NorthWestGravity
Window Gravity State: NorthWestGravity
Backing Store State: NotUseful
Save Under State: no
Map State: IsViewable
Override Redirect State: no
Corners: +5+25 -774+25 -774-683 +5-683
-geometry 80x24+1+1

-----------------------
Lo que interesa es la ID de la aplicacion que se encuentra en la siguiente linea
xwininfo: Window id: 0x1a0000d "xterm"
La iD sera ==> 0x1a0000d
Pero para el uso dela aplicacion C que permitira cambiarle sus propiedades es necesario usar un valor decimal ya que lo que muestra por defecto la aplicacion xwininfo es en hexadecimal. Para ello solo hay que agregarle el siguiente parametro:
xwininfo -int
Y mostrara el siguiente resultado
xwininfo: Window id: 27262989 "xterm"
Ya tenemos la informacion necesaria que es la ID de la aplicacion X , lo siguiente es desarrollar el programa en C que por el momento solo permitira cambiar la posicion en pantalla de la ventana ya luego en los siguientes post se le agregara nuevas funcionalidades.

/*---------xcambiargeo.c-----------*/
#include < stdio.h >
#include < stdlib.h >
#include < X11/Xlib.h >
#include < X11/Xutil.h >

int main(int argc,char *argv[])
{
Display *display;
int XwinID,Xwin_nuevaX,Xwin_nuevaY;

if(argc != 4){
fprintf(stderr,"Usar:%s nueva_posicion_x nueva_posicion_y XwinID\n",argv[0]);
return 0;
}

Xwin_nuevaX=atoi(argv[1]);
Xwin_nuevaY=atoi(argv[2]);
XwinID=atoi(argv[3]);

printf("nueva_posicion_x=%d nueva_posicion_y=%d Xaplicacion=%d \n",Xwin_nuevaX,Xwin_nuevaY,XwinID);

display = XOpenDisplay( NULL );
if(display==NULL)
{
printf("Error al abrir display\n");
return 0;
}
XMoveWindow( display,XwinID,Xwin_nuevaX,Xwin_nuevaY);
XCloseDisplay(display);
return 1;
}

/*---------------------------------*/
Compilando:
gcc -o xcambiargeo xcambiargeo.c -lX11
Uso:
./xcambiargeo nueva_posicion_x nueva_posicion_y XwinID
./xcambiargeo 200 300 27262989
Donde:
nueva_posicion_x => Es la posicion x en la pantalla
nueva_posicion_y => Es la posicion y en la pantalla
XwinID => La ID de la aplicacion X o la ventana
Al ejecutar el programa xcambiargeo , se observara que la aplicacion X cambiara de un lugar a otro en la pantalla.

Comparacion de dos archivos

Cuando se quiere comparar dos archivos del mismo tamaño y el resultado de la comparacion grabarlo en algun archivo se puede implementar algun programa en C para realizar esta funcion.
El programa que se muestra acontinuacion permite comparar 2 archivos y la diferencia es decir toda aquella informacion que no esta presente en alguno de estos 2 archivos se graba en otro.
Su modo de uso es el siguiente:
./comparar_archivos archivo_uno_a_comparar archivo_dos_a_comparar archivo_diferencia

"archivo_diferencia" es donde se grabara todos los bits diferentes entre ambos archivos.

/*-----------comparar_archivos.c----------------*/

#include < stdio.h >
#include < stdlib.h >
#include < fcntl.h >
#include < unistd.h >
#include < sys/types.h >
#include < sys/stat.h >
#include < errno.h >


int main(int argc, char *argv[])
{
int fd,fdB,fdC,x,y;
char *fila_uno, *fila_dos,*fila_nueva;
struct stat sbuf;
int z;
char c[1];
char cc[1];

if (argc != 4) {
fprintf(stderr, "usar: programa fila_uno fila_dos fichero_a_crear\n");
exit(1);
}
fila_uno=argv[1];
fila_dos=argv[2];
fila_nueva=argv[3];

if ((fd = open(fila_uno,O_RDONLY )) == -1) {
perror("open fila_uno");
exit(1);
}

if ((fdB = open(fila_dos,O_RDONLY)) == -1) {
perror("open fila_dos");
exit(1);
}

if ((fdC = open(fila_nueva, O_RDWR | O_CREAT)) == -1) {
perror("open fila_nueva");
exit(1);
}

if (stat(fila_uno, &sbuf) == -1) {
perror("stat");
exit(1);
}

for(x=0;x<(sbuf.st_size);x++)
{
z=lseek(fd,x,SEEK_SET);
y=lseek(fdB,x,SEEK_SET);
read(fd,c,1);
read(fdB,cc,1);
if( *c!=*cc)
{
write(fdC,c,1);
}
}
return 0;
}


/*----------------------------------------------*/

Compilar:
gcc -o comparar_archivos comparar_archivos.c