Archivo

Archivo para la categoría ‘Comunicación’

Login a Facebook y acceso a aplicación automatizado

Miércoles, 11 de Agosto de 2010 admin Sin comentarios

A medida que va creciendo Facebook, los desarrolladores van siendo más imaginativos a la hora de crear aplicaciones que trabajen sobre esta red. Actualmente existen clientes para Facebook que no necesitan que estemos dentro de la página, y lo que presento a continuación es un pequeño ejemplo de todo ello.

Este script es parte investigación / parte navegación y lectura de foros en los que no he encontrado la respuesta exacta a mis necesidades. El problema está en que, a pesar de la existencia de Facebook Connect, si queremos automatizar tareas en Facebook tenemos que estar identificados en el sistema y entonces es cuando podemos hacer la tarea en cuestión.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?php

$face_cookie='/tmp/fcbk_cookie';
$useragent="Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3";
$login_email='*************';
$login_pass='**************';

function curl_load_url($url, &$error, $postfields=false)
{
  global $useragent, $face_cookie;
  $cu = curl_init();
  curl_setopt($cu, CURLOPT_URL, $url);
  curl_setopt($cu, CURLOPT_HEADER, 0);
  curl_setopt($cu, CURLOPT_FOLLOWLOCATION, 1);
  curl_setopt($cu, CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($cu, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($cu, CURLOPT_USERAGENT, $useragent);
  curl_setopt($cu, CURLOPT_COOKIEJAR, $face_cookie);
  curl_setopt($cu, CURLOPT_COOKIEFILE, $face_cookie);
  if ($postfields)
    {
      curl_setopt($cu, CURLOPT_POSTFIELDS, $postfields);
      curl_setopt($cu, CURLOPT_POST, 1);
    }

  $cont=curl_exec($cu);
  $error=curl_errno($cu);

  curl_close($cu);

  return $cont;
}

function fb_login($email, $passwd)
{
  $error=false;
  curl_load_url('http://login.facebook.com/login.php', $error);

  $ch_test='&euro;,&acute;,€,´,水,Д,Є';
  $postfields='cuarset_test='.urlencode($ch_test).'&locale=es_ES&email='.urlencode($email).'&pass='.urlencode($passwd).'&pass_placeholder=&cuarset_test='.urlencode($ch_test);
  $cont=curl_load_url('https://login.facebook.com/login.php?login_attempt=1', $error, $postfields);

 /* Si hay un error de cURL lo decimos */
 if ($error)
   echo 'Error (cURL): '.$error."\n";

 /* Esta palabra *login_attempt* aparece en los intentos de login de Facebook */
 /* es raro que en la página principal salga. */
 /* Podemos también, verificar si está el enlace a editaccount.php para decir */
 /* que hemos sido identificados correctamente */
 if (strpos($cont, 'login_attempt')!==false)
/*  if (strpos($cont, 'editaccount.php')===false) */
   {
     echo 'Error (Facebook): E-mail o contraseña incorrecto';
     $err=1;
   }
 /* Si no hay errores nos daremos por identificados, aunque si el password es incorrecto */
 return (!$err);
}

if (fb_login($login_email,$login_pass)){
  $error=false;
  $cont = curl_load_url('http://apps.facebook.com/minutofilosofico/', $error);
  // Mostramos el contenido de la página
  echo $cont;
}
?>

¿Qué aplicaciones prácticas puede tener esto? Podemos hacer fácilmente un programa de escritorio para manejar Facebook, enviarnos por e-mail o un sms automáticamente si alguien que esperamos nos escribe, subir fotos de forma más rápida con un script en nuestro ordenador… o publicar un mensaje a la hora que hayamos especificado.

Como el ejemplo está en cURL será fácil portarlo a otro lenguaje con el que os sintáis más cómodos.

Extrayendo datos de direcciones web (C++ sin cURL)

Jueves, 29 de Julio de 2010 admin Sin comentarios

url

En ocasiones, estamos inmersos en un proyecto que requiere conexión con un servidor.

Soy consciente de que existen muchas librerías que nos garantizan el acceso, y tienen muchas opciones aunque, a veces, no necesitamos tanto, sólo un simple acceso y un intercambio sencillo de información; del mismo modo, no nos apetece engordar demasiado nuestro ejecutable, o hacer que nuestro programa dependa de alguna librería externa.

Con esa intención, hice esta clase para C++ y que utilicé para uno de mis pequeños proyectos
hace unos años. Tengo que advertir que es una clase muy simple, y por eso también es válida para los que se quieran iniciar en programación de sockets.

Se puede descargar mysocktar (3.7Kb)

Para compilar el ejemplo:

$ g++ -c MySock.cpp
$ g++ -o ej_mysock ej_mysock.cpp MySock.o

Aún quedan cosas por hacer, sin perder el objetivo de una clase ligera, muy ligera:

  • Hacer documentación compatible con Doxygen
  • Mejor soporte para cabeceras HTML
  • Extracción de tags HTML
  • Soporte para contraseñas

Foto: Diego_3336 (Flickr)

Enviando posts a twitter

Viernes, 28 de Mayo de 2010 admin Sin comentarios

twitter-bird-6

Hace mucho tiempo leí en anieto2k una función muy interesante para twittear sin necesidad de incluir APIs tremendas. Es decir, si en mi aplicación, sólo quiero enviar twits, ¿para qué incluir algo demasiado grande? Con una pequeña función estaría todo resuelto.

El tema es que hace poco inicié un proyecto que periódicamente envía twits y necesité echar mano de esa función. Descubrí que Twitter había cambiado un poco su forma de interactuar.

Antes, podíamos enviar por GET (en la URL) el parámetro del mensaje que íbamos a postear, aunque ahora devuelve un error extraño: 413 Request Entity Too Large, más o menos es cuando la consulta que enviamos al servidor es muy grande; aunque el error nos lo da porque no encuentra el post que queremos publicar.

Para solucionarlo, tenemos que enviarlo con el método post, de la siguiente forma:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function postToTwitter($username,$password,$message)
{
// Esta línea está modificada
    $host = "http://twitter.com/statuses/update.xml";

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $host);
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    curl_setopt($ch, CURLOPT_POST, 1);
// Esta línea es nueva
   curl_setopt($ch, CURLOPT_POSTFIELDS, 'status='.urlencode(stripslashes(urldecode($message))));
    $result = curl_exec($ch);
    $resultArray = curl_getinfo($ch);
    curl_close($ch);
    if($resultArray['http_code'] == "200")
    {
        echo "<br />OK! postedo en http://twitter.com/".$username."/<br />";
    }
    else
    {
        // Esto lo podemos quitar, es sólo para analizar la salida.
        print_r($resultArray);
        echo "<br />Error! ha ocurrido un problema<br />";
    }
}

Con esta versión modificada del script ya podemos twitear :)

Y para llamar a esta función:

postToTwitter(’usuario’, ‘contraseña’, ‘140 letras de lo que queremos twitear’);

Foto: Free Twitter Bird Icon Set

Saber si estamos conectados a internet [bash]

Miércoles, 26 de Mayo de 2010 admin Sin comentarios

cat_linuxA menudo lanzo scripts que necesitan saber si la conexión a Internet está disponible para lanzarse, en caso de que no lo esté, invertirán mucho tiempo en terminar o terminarán con muchos errores. La forma más fácil de saber cuándo estamos conectados es intentar acceder a un ordenador que sepamos seguro que está conectado… por ejemplo google.com, que para eso está.

Podemos por ejemplo hacer ping al servidor, pero un ping es muy visual, necesitaremos hacer algo más para aprovechar la salida de ese ping; aunque también podemos intentar conectar por el puerto 80 (http).

Dejo varios métodos para poder hacerlo de forma sencilla desde la línea de comandos:

ping

$ if ping -c1 google.com &>/dev/null; then echo “Tienes conexion”; else echo “no tienes conexion”; fi

Con esta línea haremos un ping a google, sólo mandaremos un paquete (-c1) y mandaremos la salida de ping a /dev/null (no nos interesa lo que nos diga, queremos hacer un script amigable al usuario, sin mensajes raros), si ping no da errores, se ha hecho bien, mostramos el mensaje de tienes conexion, si no, el de no tienes conexión.

Aunque en los siguientes scripts haremos una salida de texto, siempre podremos hacer un exit y terminar el script cuando no haya conexión.

netcat

if netcat -z google.com 80; then echo “Tienes conexion”; else echo “no tienes conexion”; fi

Igual que antes pero probamos la conexión al puerto 80, netcat utiliza el parámetro -z para ver sólo si se puede conectar, una vez se conecta, se cierra la conexión.

escribiendo en el servidor directamente

Tenemos dos métodos más…

if echo “”>/dev/tcp/totaki.com/80; then echo “Tengo conexion”; else echo “no tengo”; fi

Aquí conectamos con el servidor a través de /dev/tcp (necesitamos tener permisos), al servidor le enviamos una cadena vacía.

También podemos hacer:

if exec 3>/dev/tcp/totaki.com/80; then echo “Tengo conexion”; else echo “no tengo”; fi

Utilidades y notas

Podemos utilizarlo por ejemplo en cron scripts que requieran conexión a internet (subir una copia de seguridad a un servidor externo, enviar nuestra ip de Internet a un servidor), o por ejemplo para saber la disponibilidad de un servidor, es decir, si tenemos alquilado un servidor a lo mejor nos interesa monitorizarlo para saber si está caído, en fin los usos son los que nos de la imaginación.

Antes dije que podríamos incluir un exit cuando el script no tenga conexión, pero también podremos llamar a otro script en el caso de tener conexión, o hacer lo siguiente (con el ejemplo de ping):

1
2
3
4
5
6
7
8
#!/bin/bash
if ping -c1 google.com &>/dev/null;
then
        echo "Ejecutando script";
        $@
else
        echo "no tienes conexion";
fi

Llamamos al fichero internet, damos permisos de ejecución y podremos llamar a cualquier script de la siguiente forma:

$ internet wget http://www.totaki.com/poesiabinaria

(por ejemplo), el script sólo se ejecutará si estamos conectados a Intenet

Mejoras

Bueno, puede pasar, que alguna vez google.com esté caído, podemos intentar pasar por dos o tres servidores, si vemos que uno de ellos responde (siempre que no sea de una red local) sabremos que estamos conectados.

Foto: fotohiro (Flickr)

Ejecutar una orden externa redirigiendo STDIN [C]

Jueves, 15 de Abril de 2010 admin Sin comentarios

Cuando lo hacemos desde la línea de comando, es muy fácil:

echo -e “david\njose\nalfredo\nzacarias\npatrick\ngaspar” | sort

Pero a la hora de querer hacer un programa que ejecute la orden sort, pasándole una serie de líneas no es tan intuitivo.

Para ello, he construido una tubería, y para ello hacemos que el descriptor STDIN_FILENO sea input[0] es decir, el descriptor de lectura de la pipe (con dup2).
Luego pasamos las líneas que necesitemos a la pipe a través del descriptor input[1] y lo cerramos para dar por finalizada la entrada de datos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <unistd.h>
#include <errno.h>
#include <stdio.h>

int main()
{
  int input[2];

  pipe(input);
  dup2(input[0], STDIN_FILENO);
  write(input[1], "david\njose\nalfredo\nzacarias\npatrick\ngaspar", 43);
  close(input[1]);
  execlp("sort", NULL);
  printf("ERROR : %s", strerror(errno));
}

Notas: El código fue creado rápidamente, por ello en el write, encontramos un 43 (la longitud de la cadena).

Los nombres han sido inventados, menos los dos últimos, yo soy Gaspar y Patrick es la persona a la que agradezco parte del mérito de que este fragmento de código esté hoy aquí.

Comprobación de IP invertida / Reverse IP Lookup

Martes, 16 de Febrero de 2010 admin Sin comentarios

Desde hace mucho tiempo he utilizado CuWhois para hacer esta comprobación, ofrece muchos servicios interesantes para Webmasters y recomendaciones para posicionar mejor las webs, aunque desde hace tiempo, la comprobación de IP invertida no es tan completa como antes. Por ejemplo, hace unos años, probándola sobre este mismo dominio, daba unos 70 resultados de páginas que compartían esta misma IP (tengo un hosting compartido para esta web); ahora me dice que tengo 8 vecinos, y sólo me dice 6 de ellos.

Hoy gracias al página de Facebook de Hostarting he descubierto YouGetSignal, y aquí hay un listado más completo de las webs que encontramos en el servidor (dependiendo de con quién tengamos contratado el dominio nos convencerá mejor mirar en una u otra página, y siempre está bien que si encontramos información interesante la comprobemos a mano), y si tenemos un hosting compartido podemos ver cuánto se aprovecha nuestra empresa de hosting de nosotros y a veces, estimar más o menos cuánto están cobrando por un mismo servidor. :S Pero al menos nos da una idea aproximada de la carga que puede tener.

Atención Bill Gates ha tenido que hacerse el café esta mañana

Miércoles, 20 de Enero de 2010 admin Sin comentarios

Hoy me he levantado con la noticia de que Bill Gates (antiguo CEO de Microsoft y un multimillonario donde los haya), se ha hecho una cuenta de Twitter. Y en unas horas tiene más de medio millón de seguidores. (@BillGates).

Lo curioso es que su primer twit fue: “Hello world!”, y lo más curioso es que durante el día de hoy Twitter está saturado, y creo que sé quién tiene la culpa.

De todas formas, yo no le seguiré; si dice algo interesante, seguro que le hacen miles de retwits…

Smartbooks desde el siglo XX…

Viernes, 8 de Enero de 2010 admin Sin comentarios
Un nuevo cacharro informático

Un nuevo cacharro informático

…o, tal vez, desde una época en la que no estuvimos muchos de nosotros. Leo en un artículo de El País la noticia de un nuevo cacharro informático; es una fusión entre un netbook y un smartphone (de ahí el nombre), y entre otras cosas destaca su gran duración de la batería (cosa que está muy bien; hago viajes largos y me vendría bien poder trabajar durante todo el viaje; aunque no sé cuánto tiempo durará la batería, ya que supongo que en unos dos años no será ni un 40% de lo que es recién comprado). Pero lo que más me llama la atención del artículo es la naturalidad con la que dice:

Se acabó el esperar un par de minutos para que se encienda y se conecte a la Red.”

Hace referencia a que este nuevo artilugio podrá estar encendido todo el tiempo tal y como lo hace un móvil actualmente; pero dando datos concretos. ¿ Es normal que un ordenador tarde dos minutos en arrancar ? Es cierto que conozco personas que encienden el ordenador y se van a tomar un café mientras arranca; sé que a veces da pereza arrancar el ordenador y el navegador y poner una dirección web y dar a enter, y seguro que es mucho más rápido tenerlo encendido y sólo escribir.

Pero creo que hay que basarse en algunos datos:

  • Mi portátil, con 3 años y medio de antigüedad, tarda unos 30s.
  • Un netbook que configuré hace unos días tarda exactamente 40s.
  • En una pequeña encuesta en Facebook, sólo los usuarios de Windows tienen que esperar 2 minutos o más para arrancar (por lo general), mientras los usuarios de Mac y Linux tardan menos de 1minuto.

Nos encontramos en la carrera de los tiempos de arranque:

También es verdad que muchos usuarios todavía usan Windows Vista, y sus tiempos de arranque son muy altos; aunque si pensamos en el orden lógico de las cosas, en los ‘90 mi ordenador no tardaba dos minutos arrancando, y hasta 2004 fue creciendo el tiempo a medida que tenía un ordenador más potente… todo hasta que me pasé definitivamente a GNU/Linux, por qué será. Parece que sólo Microsoft se demora por el momento, aunque hayan conseguido que W7 arranque en 11seg (aunque no al alcance de cualquiera).

Foto: nDevilTV

Andanzas en Facebook: Publicando en los perfiles II

Sábado, 19 de Diciembre de 2009 admin 6 comentarios

Hace unos meses hice un post sobre la publicación en los perfiles del usuario en Facebook desde nuestras aplicaciones. Bien, desde el día de hoy (20/12/2009) han cambiado los métodos.

Llevan amenazando ya un tiempo, pero hasta ayer no les hice caso, y es que los nuevos métodos (aunque prometen unificar todo el sistema de publicaciones de Facebook, autopublicaciones en perfiles, para los amigos, metadatos y lectura desde nuestras aplicaciones (más info. aquí), tienen detalles que no a todo el mundo le gustan. Como por ejemplo las publicaciones multi línea, el uso de palabras clave {*actor*}, {*mensaje*}, {*palabraquemeacabodeinventar*} dentro de todos los campos de publicación y la limitación de los action links a 1 !!!!!!! :(

Lo que sí han hecho es simplificarlo todo: no tenemos que crear un template para luego utilizarlo, y el hecho de que podamos definirlo todo por código y llamarlo cuando queramos, además, no tenemos límite de publicaciones distintas, ya que como las tenemos que crear cada vez que publiquemos, podemos hacer lo que queramos (antiguamente había un límite de 100 templates por usuario, suficientes, pero a lo mejor alguien necesitaba más).

Se potencia el uso de JSON (como los arrays en Javascript), y es que si es desde Javascript desde donde llamamos a la función, lo vamos a necesitar.

Aquí incluyo un fragmento de código para una publicación (he acompañado cadenas largas y palabras clave en todas partes para ver el comportamiento de Facebook con ellas, observar qué límites tenemos y demás):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var actionlinks=[{"text":"Mi minuto filosófico","href":"http://apps.facebook.com/minutofilosofico/"},{"text":"Ésta frase en mi perfil!","href":"http://apps.facebook.com/minutofilosofico/?frase=1234"}]

var attachment = {'name': '{*actor*} No sé si funciona aquí, veamos si aparece un enlace, o también, en caso de un texto realmente largo qué pasa, porque lo mismo me pongo a escribir letras, y pasa como en el caption, que sólo sale un par de líneas, y me quedo con las ganas de que salga más texto, pero bueno, el caso es que tengo que probar tanto por el tutorial como por mis aplicaciones.',
          'properties':{0:{'text':'enlace 1',
                    'href':'http://www.totaki.com'},
                                   1:{'text':'enlace 2',
                    'href':'http://www.totaki.com'},
  },
          'description': 'Una descripcion \nlarga que incluye un enlace que \nno funciona bien: <a href="http://www.totaki.com/">con un enlace</a> y una <strong>negrita</strong> que<br/> tampoco funciona, porque Facebook ha limitado lo que puede salir en estos sitios; además, mi\n mensaje es lo suficientemente largo como para que aparezca el texto de Mostrar más. {*actor*} aquí no funciona',
          'href':'http://www.totaki.com',
          'caption': '{*actor*} está probando algunas cosillas, pero ya puestos vamos a probar un caption largo largo largo, para probar la capacidad de estos nuevos métodos que tiene Facebook para publicar en los perfiles de la gente. Tal vez el caption se corte, tal vez, muestre el texto de ver más, o tal vez el texto ni se publique por ser demasiado largo, veamos qué pasa.',
          'media':[{'type':'image',
                'src':'http://www.totaki.com/unafoto.jpg',
                'href':'http://www.totaki.com'},

],
                  };
Facebook.streamPublish('Texto para el usuario', attachment, actionlinks, null, 'Otra frase');

Nos aparece algo así:
Publicando en Facebook (tamaño completo)
En donde nos damos cuenta que:

  • Sólo caption acepta la palabra clave {*actor*} y según la documentación, sólo esa palabra clave
  • No se aceptan retornos de carro en description, sólo se aceptarán en name.
  • Nuestra publicación puede ser un enlace (pinchando en el nombre)
  • Description no acepta fbml, es texto plano, aunque resalta los enlaces

Más adelante, cuando publicamos, nos damos cuenta de que sólo se permite un action link (enlaces que acompañan a Comentar y Me gusta), en Facebook llevaban reduciendo los action links unos días para todas las publicaciones.

Aunque un detalle importante es la inclusión de las propiedades (properties), es un array que puede contener textos y enlaces que los acompañen, y se publican, he podido hacer una publicación con 12 propiedades sin problemas.

El código superior puede servir como plantilla para vuestras publicaciones.

Pero, ¿qué pasa si quiero incluir el nombre del usuario que publica en name o description? debemos recurrir a la API de Facebook, podríamos pensar que desde fbml podemos hacerlo, pero no lo permiten en estos nuevos métodos, por lo que tendremos que recurrir a un lenguaje de servidor como PHP; de la siguiente forma:

1
$yo = $facebook->api_client->users_getInfo($user_id, "uid, name, first_name");

$user_id tiene que estar previamente definida y ser la id del usuario actual (para ello, sólo hay que seguir el ejemplo que te da Facebook para crear una aplicación, copiado y pegado).
El dato que queremos, es decir el nombre, lo encontraremos en $yo[0]['first_name'], por lo que, en mitad del código fbjs anterior, si nos encontramos en un archivo PHP podemos hacer lo siguiente:

1
2
3
var attachment = {'name': '<? echo $yo[0]['first_name']; ?> sí que funciona aquí, veamos si aparece un enlace, o también, en caso de un texto realmente largo ...',
          'properties':{0:{'text':'enlace 1',
                    'href':'http://www.totaki.com'},

Tuberías con nombre para comunicación entre procesos

Domingo, 19 de Julio de 2009 blakeyed 2 comentarios

Las tuberías con nombre son un método de comunicación FIFO entre procesos (también se les llama fifos). FIFO son las siglas de First In First Out, es decir, el primero que llega es que primero que se marcha, como en una cola, el primero que llega es el que antes termina.

Observad lo que hacen las macros depura_int y depura_string, nos darán el número de línea y el archivo donde están, así como el nombre de la variable y el valor que tiene en ese momento.

Normalmente las tuberías son anónimas, aunque el hecho de tenerlas con un nombre en nuestro sistema de ficheros puede sernos de gran utilidad. Como ejemplo, podemos verlo en funcionamiento en la siguiente imagen:

Cómo hacer una pipe con nombre en 1 minuto

Cómo hacer una pipe con nombre en 1 minuto

Primero vemos el terminal de abajo, en el que se ejecuta lo siguiente:

1
2
$ mkfifo prueba
$ cat prueba

Seguidamente en el otro terminal se escribe lo siguiente:

1
$ echo "Esto es una prueba" > prueba

Automáticamente el texto “Esto es una prueba” aparece en el primer terminal. ¡Hemos logrado enviar un mensaje!

De la misma forma podemos programar aplicaciones que utilicen estas características de forma muy fácil en casi cualquier lenguaje de programación, para los ejemplos utilizaré C. Debemos hacer dos programas, uno que escriba en la tubería (pipe) y otro que lea de ella. Empezamos por pipewrite.c:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>

int main()
{
  FILE *mipipe;
  char buffer[128];
  int i=0;

  if (mkfifo("pipetest", S_IWUSR |  /* El usuario puede escribir */
                 S_IRUSR |  /* El usuario puede leer */
                 S_IRGRP |  /* El grupo puede leer */
                     S_IROTH    /* Otros pueden leer */
         )!=0)
    printf ("Hubo un problema al crear la pipe\n");

  mipipe=fopen("pipetest", "w"); /* Lo abrimos como un fichero normal y corriente */

  /* Con esta línea leemos hasta que se cierre la tubería por el otro */

  while (i<10)
    {
      sprintf(buffer, "CADENA ENVIADA Número: %i\n", i+1);
      fputs(buffer, mipipe);
      i++;
    }

  fclose(mipipe);       /* Cerramos la tubería por aquí también */

Y ahora pipecilla.c (o el programa que leerá la pipe):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>

int main()
{
  FILE *mipipe;
  char buffer[128];
  if (mkfifo("pipetest", S_IWUSR |  /* El usuario puede escribir */
                 S_IRUSR |  /* El usuario puede leer */
                 S_IRGRP |  /* El grupo puede leer */
                     S_IROTH    /* Otros pueden leer */
         )!=0)
    printf ("Hubo un problema al crear la pipe\n");

  mipipe=fopen("pipetest", "r"); /* Lo abrimos como un fichero normal y corriente */

  /* Con esta línea leemos hasta que se cierre la tubería por el otro */
  while (!feof(mipipe))      
    {
      if (fgets(buffer, 128, mipipe))
      printf ("RECIBIDO: %s", buffer);
    }

  fclose(mipipe);       /* Cerramos la tubería por aquí también */
}

Ahora compilamos y ejecutamos en terminales diferentes de nuevo:
Probando pipes
En el terminal de pipewrite.c, al ejecutar el programa da un mensaje de error, es porque la pipe ya existe (se creó en el programa anterior).

Esta forma de comunicación es unidireccional, puede ser últil por ejemplo para publicar el estado de un programa (un reproductor de audio podría publicar la canción que está sonando como en xmms-infopipe), o para modificar el comportamiento de un software mientras éste está en ejecución. Pero si queremos que nuestras aplicaciones dialoguen (en full-duplex), debemos tener dos pipes simultáneas, en ese caso, la aplicación 1, por ejemplo deberá leer en la tubería 1 y escribir en la tubería 2; y la aplicación 2, deberá escribir en la tubería 1 y leer en la tubería 2.

Visita otras webs de la red

Easy AdSense by Unreal