| Subcribe via RSS

Procesos en C: Crear un nuevo proceso con fork()

Octubre 26th, 2009 | No Comments » | Posted in C/C++, programacion

Siguiendo con los artículos sobre procesos voy a poner aquí un sencillo ejemplo para ilustrar el funcionamiento de la función fork().

Esta función es la que se encarga de crear un nuevo proceso dentro de un proceso. El nuevo proceso creado es una copia exacta del original, con la única diferencia que cada uno de ellos tiene su propio identificador de proceso (pid).

#include <stdio.h>
 
int main() {
	int pid;
 
	printf("PADRE: Soy el proceso padre y mi pid es: %d\n", getpid());
 
	pid = fork();
 
	// En cuanto llamamos a fork se crea un nuevo proceso. En el proceso
	// padre 'pid' contendrá el pid del proceso hijo. En el proceso hijo
	// 'pid' valdrá 0. Eso es lo que usamos para distinguir si el código
	// que se está ejecutando pertenece al padre o al hijo.
 
	if (pid) // Este es el proceso padre
	{
		printf("PADRE: Soy el proceso padre y mi pid sigue siendo: %d\n", getpid());
		printf("PADRE: Mi hijo tiene el pid: %d\n", pid);
	}
	else // Proceso hijo
	{
		printf("HIJO: Soy el proceso hijo y mi pid es: %d\n", getpid());
		printf("HIJO: mi padre tiene el pid: %d\n", getppid());
	}
}

En un próximo post explicaré cómo convertir el proceso hijo en un nuevo proceso totalmente diferente (con el conjunto de funciones ‘exec’). Esto nos permitirá lanzar un programa desde dentro de otro.


¿Necesitas ayuda con algún trabajo de clase? Entra en BuscoProfe.com

Tags: , , ,

Procesos en C: Ejemplo de un sencillo cronómetro con SIGALRM

Octubre 19th, 2009 | No Comments » | Posted in C/C++, programacion

Continuando con el artículo de la semana pasada sobre procesos en C hoy os dejo aquí un sencillo ejemplo de un cronómetro:

// Para las funciones pause y alarm:
#include <unistd.h>
// Para las constantes SIGALRM y similares
#include <signal.h>
 
#include <stdio.h>
 
// Esta es la función que se va a ejecutar cada vez que se reciba la
// señal SIGALRM
void contar_segundos() {
	// Usamos static para que se conserve el valor de "segundos"
	// entre cada llamada a la función
	static int segundos=0;
 
	segundos++;
	printf("Han pasado %d segundos.\n", segundos);
}
 
int main() {
	// Asociamos la señal SIGALRM a la función contar_segundos
	signal(SIGALRM, contar_segundos);
 
	// Ponemos en marcha un bucle
	while(1) {
		// Establecemos una alarma para dentro de un segundo
		alarm(1);
		// Pausamos la ejecución del programa para que 
		// se quede esperando a recibir una señal.
		pause();
	}
}

¿Necesitas ayuda con algún trabajo de clase? Entra en BuscoProfe.com

Tags: , , ,

Introducción a Bash: control de flujo en nuestro script (if/else)

Mayo 25th, 2009 | No Comments » | Posted in Bash, linux, programacion

Hoy vamos a añdadir un poco más de salsa a nuestra introdicción a Bash. Vamos a ver cómo funciona el if/else.

La estructura de un if/else en bash es la siguiente:

if [ condicion ]; then
      ...
else
      ...
fi

(el “else” es opcional).

Ojo, los corchetes deben ir siempre separados de la condición por un espacio.

Comparaciones aritméticas:

Aquí tenéis una lista de comparaciones que se pueden hacer entre números.

  • -lt : menor que (less than)
  • -gt : mayor que (greater than)
  • -le : menor o igual (less or equal)
  • -ge : mayor o igual (greater or equal)
  • -eq : igual a (equal)
  • -ne : distinto de (not equal)

Compraraciones con cadenas

  • = : igual
  • != : distinto
  • < : menor que
  • > : mayor que
  • -n c1 : se cumple si la cadena c1 no está vacía
  • -z s1 : se cumple si la cadena c1 está vacía

If anidados

Desde luego, se pueden usar if/else dentro de otros if/else, se pueden anidar sin problemas.

Ejemplo

Y para ilustrar todo esto vamos a ver un sencillo ejemplo que espera que le pasemos una palabra como parámetro:

#!/bin/bash
 
if [ $# -eq 0 ]; then
	echo "Dime algo, por favor"
else
	if [ $1 = 'hola' ]; then
		echo "Hola! que tal?"
	else
		echo "No te entiendo, solo entiendo la palabra 'hola'"
	fi
fi

Si lo guardamos en un fichero llamado if.sh y le damos permisos de ejecución (chmod +x if.sh) esto es lo que responderá dependiendo de qué parámetros usemos:

$ ./if.sh
Dime algo, por favor
$ ./if.sh nada
No te entiendo, solo entiendo la palabra 'hola'
$ ./if.sh hola
Hola! que tal?
Tags: , ,

Code Igniter: llamar a un controlador desde consola o desde otro fichero.php

Abril 30th, 2009 | No Comments » | Posted in code igniter, php, programacion

Si has trabajado con Code Igniter encontrarás este “truquillo” de mucha utilidad. Te permitirá llamar a un controlador desde consola o desde otro fichero PHP. Por ejemplo:

1) Supón que tienes una tarea (en un cron) que tiene que llamar a un controlador de tu aplicación Code Igniter. Supongamos que tienes un controlador que se llama ’saludar’ y quieres llamar a la función ‘decir_hola’ de ese controlador. No puedes hacer la llamada así:

php /var/www/saludar/decir_hola

ni:

php /var/www/index.php/saludar/decir_hola

(pruébalo)

2) También es posible que necesites recibir parámetros $_GET pero, por ejemplo, no sabes en el orden en el que te los van a enviar.

En ambos casos puedes crear un fichero llamado, por ejemplo, redirigir.php con el contenido siguiente:

<?php
// Recoger parámetros o cualquier otra tarea previa que necesites antes de llamar al controlador
...
// Fin de tareas previas
 
$_SERVER['PATH_INFO']    = 'saludar/decir_hola';
 
require('index.php');
?>

o incluso, podemos pasarle parámetros desde la consola:

<?php
$_SERVER['PATH_INFO']    = $argv[1];
require('index.php');
?>

(Si usas el fichero .htaccess no olvides añadir este fichero redirigir.php para que se pueda ejecutar).

Tags: , ,

Curso de PHP: Ejercicios de cadenas y funciones

Abril 29th, 2009 | No Comments » | Posted in php, programacion

Dado que llevo bastante tiempo impartiendo cursos de PHP en Bilbao ya va siendo hora de poner un poco de orden y actualizar los ejercicios.

Según los vaya poniendo “bonitos” los iré publicando aquí.

En esta primera tanda pondré algunos ejercicios de cadenas y funciones que servirán de repaso a mis alumnos. A ver si se animan algunos a hacerlos, que haciendo el esfuerzo de resolverlos es como se aprende, no mirando cómo los resuelve otro (este es un pequeño tirón de orejas para un par de personas :-D ).

<?php
/*
 * Para los siguientes ejercicios se deben/pueden usar las siguientes funciones:
 * 
 * - substr($cadena, $comienzo, $longitud);
 * 		Extrae una subcadena de una cadena:
 * 		$cadena - es la cadena de la que queremos sacar una subcadena
 * 		$comienzo - es la posición a partir de la que empezamos a extraer. El primer carácter
 * 		está en la posición 0.
 * 		$longitud - con este parámetro indicamos la longitud de la cadena. Es opcional, si
 * 		no lo ponemos nos cogerá todo desde el comienzo que hemos especificado hasta el final.
 * 
 * - strlen($cadena);
 * 		Cuenta el número de caracteres que tiene la cadena.
 * 
 * - strtoupper($cadena);
 * 		Convierte una cadena en mayúsculas.
 */
 
/*
 * Ejercicio 1:
 * 
 * Escribir una función que convierta la primera letra de una cadena en mayúsculas.
 * 
 */
 
echo '<h1>Ejercicio 1</h1>';
 
function corregir_primera_letra($cadena)
{
 
}
 
echo corregir_primera_letra('gorka'); // --> debe mostrar: Gorka
echo "<br/>";
echo corregir_primera_letra('GORKA'); // --> debe mostrar: GORKA
echo "<br/>";
echo corregir_primera_letra('Gorka'); // --> debe mostrar: Gorka
echo "<br/>";
 
/*
 * Ejercicio 2:
 * 
 * ¿Daría algún error si usamos una cadena de una sola letra? ¿Sabrías por qué?
 * 
 */
 
echo '<h1>Ejercicio 2</h1>';
echo corregir_primera_letra('G');
echo "<br/>";
 
/*
 * Ejercicio 3:
 * 
 * ¿Funcionaría bien la siguiente función? Por el nombre es evidente que no pero
 * ¿por qué? 
 */
 
function corregir_primera_letra_version_mala($cadena)
{
	$letra = substr($cadena, 0, 1);
	$letra = strtoupper($letra);
	$resto = substr($cadena, 1);
	$cadena_corregida = $letra . $cadena;
	return $cadena_corregida;	
}
 
/*
 * Ejercicio 4:
 * 
 * Crear una función que coja una cadena, ponga la primera en mayúsculas y
 * el resto en minúsculas.
 */
 
function corregir_mayusculas($cadena)
{
 
}
 
echo '<h1>Ejercicio 4</h1>';
echo corregir_primera_letra('gorka'); // --> debe mostrar: Gorka
echo "<br/>";
echo corregir_primera_letra('GORKA'); // --> debe mostrar: Gorka
echo "<br/>";
echo corregir_primera_letra('Gorka'); // --> debe mostrar: Gorka
echo "<br/>";
 
/*
 * Ejercicio 5:
 * 
 * Escribir una función que cuente el número de 'a' minúsculas que hay en una frase.
 * (usar for en lugar de foreach)
 */
 
function contar_letra_a($cadena)
{
 
}
 
echo '<h1>Ejercicio 5</h1>';
echo contar_letra_a('gorka'); // --> debe mostrar: 1
echo "<br/>";
echo contar_letra_a('La bala mata la vaca'); // --> debe mostrar: 8
echo "<br/>";
echo contar_letra_a('El oso osó asir a la osa'); // --> debe mostrar: 4
echo "<br/>";
 
/*
 * Ejercicio 6: (este es para nota)
 * 
 * Escribir una función que cuente el número de mayúsculas de una cadena.
 * 
 */
 
function contar_mayusculas($cadena)
{
 
}
 
echo '<h1>Ejercicio 6</h1>';
echo contar_mayusculas('gorka'); // --> debe mostrar: 0
echo "<br/>";
echo contar_mayusculas('La bala mata la vaca'); // --> debe mostrar: 1
echo "<br/>";
 
/*
 * Ejercicio 7: (este es para nota)
 * 
 * Si usamos una cadena como la que viene a continuación ¿contará bien? ¿por qué?
 * ¿cómo corregirías la función? (pista: problemas con la letra 'Ñ')
 * 
 */
echo '<h1>Ejercicio 7</h1>';
echo contar_mayusculas('El Ñoño Niñato Ñoñeaba sin parar');
echo "<br/>";
 
function contar_mayusculas_corregida($cadena)
{
 
}
 
echo contar_mayusculas_corregida('El Ñoño Niñato Ñoñeaba sin parar');
echo "<br/>";
?>
Tags: , , ,

Bash: listar los usuarios de un ordenador

Abril 24th, 2009 | No Comments » | Posted in Bash, linux, programacion, ubuntu

Dado que últimamente estoy haciendo bastantes cosillas con bash voy a poner una serie de “truquillos” aquí.

NOTA: El ejemplo que propongo aquí es un copia/pega de un script que creé para un servidor y una finalidad muy concretas.

En cierto servidor necesitaba tener un listado de los usuarios. Una posibilidad puede ser ir al directorio home y ver allí los usuarios (cada usuario tendrá un directorio ‘home’).

for directorio in /home/*; do
	echo ./actualizador_cada.sh $directorio.
done

dará como resultado:

/home/gorka
/home/alumno
/home/lost+found
/home/mysql
...

Si queremos que no nos muestre ‘/home’ podemos eliminar esa parte de cada directorio usando una subcadena:

echo ${directorio:6}

(esto mostrará una subcadena de $directorio desde la posición 6 hasta el final)

for directorio in /home/*; do
	echo ${directorio:6}
done

dará como resultado:

gorka
alumno
lost+found
mysql
...

NOTA: esto funciona en un sistema en el que los usuarios tengan directorios ‘home’ iguales a su nombres de usuario.

Seguramente verás que hay algunos usuarios que no te interesan (en mi caso sólo me interesaban los usuarios “reales”) así que añadí unas líneas para eliminar los que no interesaban (mysql, lost+found, etc…):

usuarios_no_validos=( 'mysql' 'lost+found')
for directorio in /home/*; do
	valido=1
	usuario=${directorio:6}
	for usuario_no_valido in ${usuarios_no_validos[@]}; do
		if [ $usuario_no_valido = $usuario ]; then
			valido=0
		fi
	done
	if [ $valido -eq 1 ]; then
		echo $usuario
	fi
done
Tags: , , ,

Aptana Studio en Ubuntu

Abril 9th, 2009 | 1 Comment | Posted in heramientas, php, programacion

Después de un tiempo usando Eclipse para los proyectos de Python he decidido buscarme otra opción para mis proyectos basados en PHP (que no son pocos). Desde hace unos años vengo usando el Quanta Plus, que cumplía a la perfección con lo que necesitaba. Sin embargo echo de menos algunas cosillas que puedo usar cuando desarrollo con Python en Eclipse.

Así que me he decidio a instalar algunos de los plugins para PHP que tiene Eclipse (entre otros el PDT). Creo que todos ellos me han dado problemas y, cuando estaba a punto de desistir, he recordado a Aptana Studio, que puede funcionar él solito o como un plugin de Eclipse. Me lo he descargado y, para variar, ha habido problemas. Después de investigar un poco he encontrado la solución aquí:

http://forums.aptana.com/viewtopic.php?t=7147

Parece que el problema tiene que ver con Xulrunner, la versión que instala Ubuntu por defecto, la 1.9.0.3 no es compatible con Aptana (en el post explican cómo solucionarlo).

Dado que lo que me interesaba era desarrollar con PHP me he instalado también el plugin para PHP (es muy sencillo, basta ir a la pestaña “My Aptana” y pinchar en Plugins, y finalmente en el “Get it” que está justo bajo “Aptana PHP”.

Entre otras cosas (como el tener un panel con el listado de todas las funciones y objetos que tienes en el fichero que estás editando) hay una que me gusta especialmenete; se trata de la sincronización. Esta sincronización te permite definir y subir/bajar ficheros al/del servidor, lo que acelera enromemente el trabajo.

Os recomiendo que lo probéis.

Tags: , , , ,

Extraer elementos aleatoriamente de un array en PHP

Noviembre 27th, 2008 | 1 Comment | Posted in php, programacion

Os dejo aquí un pequeño código que os permitirá extraer elementos de manera aleatoria de un array. La explicación un poco más abajo.

Este ejemplo toma un array y muestra dos elementos escogidos de manera aleatoria.

<?
$elementos = array('tortilla de patata', 'bonito con tomate',
'morcilla con pimientos', 'salmón ahumado');
$claves = array_rand($elementos, 2);
foreach($claves as $clave)
{
	echo $elementos[$clave];
}
?>

Explicación:

$elementos = array('tortilla de patata', 'bonito con tomate',
'morcilla con pimientos', 'salmón ahumado');

Esto es un array, no necesita mucha explicación. Un detalle importante, estoy escribiendo esto cerca de la hora de comer, por eso todos los elementos son platos que me encantan.

$claves = array_rand($elementos, 2);

Esta función nos devuelve un array $claves que contendrá dos (porque así lo hemos indicado) elementos que serán dos índices (o claves) aleatorios del array $elementos.

foreach($claves as $clave)

Con este foreach recorreremos el array de claves aleatorias y mostramos con el echo mostramos los valores.

Un pequeño apunte: antes de la versión de PHP 4.2.0 era necesario inicializar el generador de números aleatorios:

srand((float) microtime() * 10000000);
Tags: , , ,

cURL y PHP: hacer una llamada a una página en segundo plano

Noviembre 11th, 2008 | 3 Comments | Posted in php, programacion

Hace un par de días os hablaba de cURL. Hoy vamos a ver un sencillo ejemplo con esta librería.

En este ejemplo, vamos a conectarnos desde nuestro servidor con Google y vamos a pedirle que nos busque resultados que contengan la palabra ‘curl’:

<?
if(function_exists('curl_init')) // Comprobamos si hay soporte para cURL
{
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL,
		"http://www.google.es/search?hl=es&q=curl");
	curl_setopt($ch, CURLOPT_TIMEOUT, 30);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
	$resultado = curl_exec ($ch);
 
	print_r($resultado);
}
else
	echo "No hay soporte para cURL";
?>

Lo primero que debemos hacer es iniciar la sesión cURL:

$ch = curl_init();

esto nos devuelve un “manejador” $ch que identifica a la sesión cURL recién creada.

Ahora vamos a indicarle cuál es la URL a la que nos queremos conectar:

curl_setopt($ch, CURLOPT_URL,
		"http://www.google.es/search?hl=es&q=curl");

En este caso vamos a realizar una búsqueda en google sobre el término ‘curl’.

Establecemos un tiempo máximo de respuesta:

curl_setopt($ch, CURLOPT_TIMEOUT, 30);

Esta línea la veremos más abajo:

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

Si en el servidor al que nos conectamos hubiese alguna redirección (código 302) y nos interesa seguirla entonces debemos decírselo a cURL:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

En este caso no es necesario, pero lo he dejado como nota didáctica.

Finalmente hacemos la llamada:

$resultado = curl_exec ($ch);

Como hemos establecido el parámetro CURLOPT_RETURNTRANSFER, curl_exec va a devolver la respuesta del servidor y la va a almacenar en la variable $resultado. Si no hubiésemos establecido ese parámetro curl_exec hubiese devuelto verdadero o falso dependiendo de si la operación se ha realizado con éxito.

Este es un ejemplo muy sencillo sin valor más allá del didáctico, pero puede tener muchas aplicaciones. Por ejemplo se puede usar en pasarelas de pago como PayPal para hacer una llamada en segundo plano al servidor.

Tags: , ,

libCurl en PHP

Noviembre 7th, 2008 | 4 Comments | Posted in php, programacion

libCurl es una biblioteca (o, como suele decirse: librería) para la transferencia de archivos que soporta varios protocolos (FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS y FILE).

Lo más habitual es que el soporte para cURL venga “de serie” en una instalación PHP. Si no es así tienes dos opciones:

1) Compilar el PHP añadiendo el soporte para cURL (necesitas tener la librería libCurl instalada antes de compilar el PHP). Aquí tienes instrucciones en inglés sobre cómo compilar PHP con soporte cURL.

2) Instalar el paquete php5-curl de tu distribución Linux (el nombre del paquete puede variar).

En algunas versiones tendrás que editar el fichero php.ini y modificar la línea:

;extension=php_curl.so

quitando el símbolo ‘;’ y dejarla así:

extension=php_curl.so

En otras basta con asegurarse que tenemos el fichero curl.so en el directorio:

/usr/lib/php5/extensions

Eso sí, una vez añadido el soporte para cURL deberemos reiniciar Apache:

/etc/init.d/apache restart

¿Cómo puedo comprobar si cURL está disponible en mi instalación Apache/PHP?

Puedes probarlo con el siguiente código:

<?php
if(function_exists('curl_init'))
   echo "Hay cURL";
?>

o puedes hacerlo con la función:

que te mostrará esta y otras valiosas informaciones sobre tu servidor.

En una próxima entrega veremos un ejemplo de trabajo con cURL.

Tags: , , ,