SlideShare ist ein Scribd-Unternehmen logo
1 von 84
Downloaden Sie, um offline zu lesen
HACK X CRACK: UN SERVIDOR FTP EN LA CONSOLA XBOX --> EVOLUTION X
                                  ESTE MES
                              P 16 páginas
                              P
                              A extra!!!
                              A
                              S
                              S
                              O
                              O
P A S Oa EN EL PROXIMO NUMERO: HACKEA WINDOWS EN 40 SEGUNDOS
P A    a
       a
       a
       a
       a
       a
       aa
        a
        a
        a
        a
        a
   NUMERO 16
 PROGRAMACION DEL SISTEMA



        COMUNICACION
          ENTRE PROCESOS
                                   DESTRIPANDO
                                           TOCOLOS
                                    LOS PROTOCOLOS
                                   DE   INTERNET

  HACIENDO COPIAS DE
   SEGURIDAD DE TUS
       JUEGOS

 ULTIMA ENTREGA
 DEL CURSO


   Nº 16 -- P.V.P. 4,5 EUROS
                      00016




    8 414090 202756

                                  LOS MEJORES ARTÍCULOS GRATIS EN NUESTRA WEB
   P C PA S O A PA S O : A B R I E N D O A R C H I V O S R E M O TO S C O N P H P
P
                              A
                              S
                              O
            aa
     P A S Oaa
            aa
            a
            a
            aa
             a
             a
             a
             a
             a
             a
             aa


EDITORIAL: EDITOTRANS S.L.                      Director de la Publicación
                                                J. Sentís
C.I.F:     B43675701
PERE MARTELL Nº 20, 2º - 1ª                     E-mail contacto
43001 TARRAGONA (ESPAÑA)                        director@hackxcrack.com
Director Editorial                              Diseño gráfico:
I. SENTIS                                       J. M. Velasco
E-mail contacto
director@editotrans.com                         E-mail contacto:
Título de la publicación
Los Cuadernos de HACK X CRACK.                  grafico@hackxcrack.com
Nombre Comercial de la publicacíón
PC PASO A PASO                                  Redactores
Web: www.hackxcrack.com                         AZIMUT, ROTEADO, FASTIC, MORDEA, FAUSTO,
Dirección: PERE MARTELL Nº 20, 2º - 1ª.         ENTROPIC, MEIDOR, HASHIMUIRA, BACKBONE,
            43001 TARRAGONA (ESPAÑA)
                                                ZORTEMIUS, AK22, DORKAN, KMORK, MAILA,
                                                TITINA, SIMPSIM... ... ... ... ...
¿Quieres insertar publicidad en PC PASO A Contacto redactores
PASO? Tenemos la mejor relación precio-difusión redactores@hackxcrack.com
del mercado editorial en España. Contacta con
nosotros!!!                                     Colaboradores
                                                Mas de 130 personas: de España, de Brasil, de
Director de Marketing                           Argentina, de Francia, de Alemania, de Japón y
Sr. Miguel Mellado                              algún Estadounidense.
Tfno. directo: 652 495 607
Tfno. oficina: 877 023 356
E-mail: miguel@editotrans.com                   E-mail contacto
                                                colaboradores@hackxcrack.com
                                                Imprime
                                                I.G. PRINTONE S.A. Tel 91 808 50 15
                                                DISTRIBUCIÓN:
                                                SGEL, Avda. Valdeparra 29 (Pol. Ind.)
                                                28018 ALCOBENDAS (MADRID)
                                                Tel 91 657 69 00 FAX 91 657 69 28
                                                WEB: www.sgel.es

                                                TELÉFONO DE ATENCIÓN AL CLIENTE: 977 22 45 80
                                                Petición de Números atrasados y Suscripciones (Srta. Genoveva)

                                                HORARIO DE ATENCIÓN:                DE 9:30 A 13:30
                                                                                   (LUNES A VIERNES)
                                                © Copyright Editotrans S.L.
                                                NUMERO 16 -- PRINTED IN SPAIN
                                                PERIOCIDAD MENSUAL
                                                Deposito legal: B.26805-2002
                                                Código EAN:      8414090202756
EDITORIAL
      el tiempo y las promesas
Ante todo una ración de disculpas. Hasta el día 21 de
Enero no pudimos tener la WEB operativa al 100% y
muchos lectores no pudieron bajarse los programas y
artículos liberados. Lamentamos este retraso y no hay
excusa que valga, podemos decir que tuvimos problemas          4   EDIT ORIAL
con la forma en que el servidor interpretaba nuestra
                                                               5   CURSO DE PHP: MANE JO DE F ICHER OS
codificación en PHP (cosa que es cierta), pero eso no
importa, deberíamos haber tenido La Web al 100% desde          16 PR OGRAMA CION BA JO LINUX: EL SIS T EMA IPC
el día 1 de Enero.
                                                               29 SER VIDOR DE HXC . MODO DE EMPLE O

Otra más… se ha recibido muchas protestas por el mal           30 CURSO XML:DOM (III)
funcionamiento de los Servidores de Hack. Azimut ha
                                                               42 C ONCURSO DE SUSE LINUX 9.0
estado retocando los protocolos de reinstalación semanal
y esperamos que a partir de ahora se cumplan las               43 BA J ATE NUESTR OS L OGOS Y MEL ODIAS
reinstalaciones y los servidores se mantengan ON LINE.         43 G AN ADOR DEL C ONCURSO DE SUSE LINUX
No obstante, debemos tener en cuenta que los servidores
están para ser hackeados y que algunas personas los dejan      43 C OLAB ORA C ON NOSO TR OS
inoperativos cuando hacen sus prácticas.                       4 4 XB O X (II): EV OL UTION X

Otra de las grandes peticiones es que escribamos artículos     55 SERIE RAW (10): USENET
de Hacking Básico. Bien, en nuestra opinión el Hacking         79 NUMER OS ATRAS ADOS
Básico no existe (o al menos no puede llamarse hacking);
pero no podemos ignorar las peticiones de nuestros lectores,   82 SUSCRIPCIONES
así que a partir del mes que viene habrá un artículo de
Hack-Básico para disfrute del personal. Empezaremos por
hackear cualquier sistema Windows NT/2000/XP en 40
segundos (o menos), algo que todo “iniciado” debería
saber y, sobretodo, algo que cualquier Administrador de
Sistemas debería conocer.

Si crees que es imposible fulminar la seguridad de un
Windows en 40 segundos, prepárate para el mes que
viene!!! ;)

GRACIAS una vez más a colaboradores, lectores y foreros.

GRACIAS
      GRACIAS
            GRACIAS
            GRACIAS
      GRACIAS
GRACIAS
curso de php:
      Aprende a manejar ficheros con PHP

                           - Trabajando con ficheros y directorios desde PHP
                           - Abriendo ficheros remotos
                           - ¿Qué es CSV?

          Continuamos con el curso de PHP. En este                1. Abrir el fichero, para ello hay que
          número aprenderemos a manejar tanto la                  especificar       como se va a abrir.
          lectura como la escritura. Continuaremos
          mejorando el programa de generación de IP,              2. La acción sobre el fichero, (escribir o
          en esta ocasión las IPs en vez de ser                   leer).
          presentadas en pantalla serán guardadas en
          un fichero para su posterior tratamiento. Y             3. Y por último, cerrar el fichero.
          además aprenderemos a consultar datos de
          manera remota.                                     Abrir ficheros

                                                             Para abrir un fichero se utiliza la función fpen().
          Manejo de ficheros y directorios.
                                                             Esta función es muy potente y no tan conocida,
                                                             pues permite abrir un fichero del servidor vía
          En una aplicación creada con PHP es posible
                                                             HTTP o FTP.
          recuperar datos y guardarlos en ficheros para
          su posterior tratamiento. Hasta ahora todos
                                                             Esto último lo veremos más adelante y verás
          los ejemplos que se han comentado muestran
                                                             la importancia que tiene (cuando supe que
          los resultados en el navegador, con lo que una
                                                             fopen() era capaz de conectarse remotamente
          vez que se cierra el navegador perdemos los
                                                             a otras máquinas yo alucinaba).
          datos generados. Para evitar la perdida de
          información podemos guardar dichos datos en
                                                             La sintasix es la siguiente:
          un archivo para que posteriormente podamos
          tratarlos. ¿No sería mejor que las IPs generadas
                                                             fopen (string nombrefichero, string modoApertura);
          de en el ejemplo del número anterior fueran
          guardadas en un fichero?, pues eso será lo
                                                             La cadena nombreFichero debe contener la
          que haremos.
                                                             ruta completa para abrir el fichero.
          PHP ofrece al programador un conjunto de
                                                             El modoApertura especifica como se debe
          funciones y procedimientos mediante los cuales
                                                             abrir el fichero, va asociado al tipo de acción
          es posible acceder a un fichero de texto para
                                                             que se desea realizar (escribir,leer).
          leerlo, modificarlo, añadirle o quitarle líneas.
          Del mismo modo que podemos tratar ficheros,
                                                             Si nombreFichero comienza con "http://" (no
          también podemos manejar directorios, podemos
                                                             es sensible a mayúsculas), se abre una conexión
          crear, renombrar y eliminar carpetas.
                                                             HTTP 1.0 hacia el servidor especificado y se
                                                             devuelve un apuntador de fichero al comienzo
          Manejo de ficheros
                                                             del texto de respuesta.

          El proceso a seguir para acceder a un fichero,     No maneja redirecciones HTTP, por eso se debe
          sea para consultar el contenido o para             incluir una barra final cuando se trata de
          modificarlo va asociado a 3 pasos:                 directorios.

PC PASO A PASO Nº 16                                                                                               Página 5
Programación PHP - Programación PHP - Programación PHP - Programación PHP




           Si nombreFichero comienza con "ftp://" (no
           es sensible a mayúsculas), se abre una conexión          !                 ¿Como?...
           ftp hacia el servidor especificado y se devuelve
           un apuntador al fichero requerido. Si el servidor
           no soporta ftp en modo pasivo, esto fallará (si        ¿Cómo? ¿no sabes ejecutar el código?               <?
           no sabes lo que es FTP en modo pasivo                  Ufffff, eso es que no has seguido nuestro curso de
           descárgate gratis el número 1 de esta revista          PHP. Tranquilo, puedes pedir los números atrasados
           desde la Web www.hackxcrack.com).                      de PC PASO A PASO desde nuestra Web
                                                                  (www.hackxcrack.com) y/o descargarte de forma
           Se pueden abrir fichero via ftp para leer o para       gratuita los artículos liberados.
           escribir (pero no ambas cosas
           simultáneamente).                                   <?
                                                               $fichero=”c:windowsphp.ini”; // fichero que deseamos abrir.
                                                               if (fopen($fichero,”r”)) { // comprobamos si el fichero se puede abrir para lectura.
           Existen seis modalidades diferentes para abrir
                                                                     print (“El fichero $fichero se ha podido abrir con éxito”);
           un fichero:                                         } else {
                                                                     print (“Error al abrir el fichero.”);
                                                               }
                                                               ?>


                                                                 En la plataforma Windows, ten cuidado de escribir
                                                                 correctamente las barras invertidas en el path del fichero
                                                                 (poniéndolas dobles), o usa barras directas.


                                                               También se podría haber colocado el fopen de la siguiente
                                                               manera con el mismo efecto:

                                                               if (fopen(”c:windowsphp.ini”,”r”)) {

                                                               Prueba a cambiar el valor $fichero, para que puedas
                                                               comprobar ambos resultados. Experimenta con las barras
                                                               inclinadas, por norma se suele utilizar las barras dobles.
                                                               En el ejemplo damos por supuesto que el fichero existe, en
                                                               caso de que el fichero no exista dará error de PHP.



           El último valor de la tabla será ignorado en
           sistemas Unix/Linux ya que no existe distinción
           entre este tipo de fichero por lo que el valor
           será ignorado.

           Primer ejemplo:
           Vamos a comenzar con un sencillo ejemplo.
           Ejecuta el siguiente código, el cual abre el
           fichero php.ini, situado en la ruta
           c:windowsphp.ini, con operación de lectura
           (valor: r).                                                         Resultado de abrir el fichero
                                                                               “php.ini” con la función fopen()

Página 6                                                                                                        PC PASO A PASO Nº 16
Programación PHP - Programación PHP - Programación PHP - Programación PHP




                                                              <?
                                                              $fichero=”c:windowsphppp.ini”;
                                                              // Introducimos un error en el nombre del fichero
                                                              fopen($fichero,”r”) or die (“El fichero no se ha podido abrir.”);
                                                              ?>


                                                              Con este código tenemos el siguiente resultado:




   Resultado al abrir el fichero con un error


          ¿Cuándo puede dar error al abrir un fichero?,
          si el fichero está abierto por otra aplicación
          puede que tenga todos los privilegios
          y no permita abrir el fichero a otros
          programas, por lo que tendremos que
          esperar a que la aplicación deje de utilizar el
          archivo.
                                                              Como se puede ver en la imagen el fichero no
                                                              se ha encontrado y aparece el mensaje “El
          En el ejemplo se abre el fichero php.ini para
                                                              fichero no se ha podido abrir”, pero sigue
          su lectura tal y como indica el valor “r”.
                                                              apareciendo un mensaje de WARNING, por lo
                                                              que seguimos mostrando una alerta de PHP y
          Si se consigue abrir la función fopen devolverá     lógicamente no deseamos que se vea el
          el valor TRUE y FALSE en caso de que no haya        WARNING, ¿qué se puede hacer?.
          sido posible abrir el archivo para lectura.
                                                              Simplemente añadiendo el simbolo @ a fopen,
          La función fopen() devuelve un identificador        ¿cómo?, pues como indica el siguiente ejemplo:
          creado al abrir el fichero y que será necesario
                                                              <?
          para utilizar las funciones de escribir y leer el   $fichero=”c:windowsphppp.ini”; //Introducimos un error en el nombre del fichero.
          fichero.                                            @fopen($fichero,”r”) or die (“El fichero no se ha podido abrir.”);
                                                              ?>

          Para capturar el identificador (también llamado
                                                              El símbolo puede añadirse a cualquier función
          hadler) se podría haber utilizado la siguiente
                                                              para evitar que se vean los WARNING,
          sintaxis:
                                                              lógicamente existen soluciones mejores, lo
                                                              veremos más adelante.
          $fi=fopen($fichero,"r");     // la variable $fi
          // tomará el valor que hace referencia al fichero
                                                              Cerrar ficheros
          Con fopen() también podemos utilizar la
                                                              Una vez que han finalizado las tareas con el
          función die(). Envía un mensaje y finaliza la
                                                              fichero es recomendable cerrar el archivo. Para
          ejecución del script.                               ello, se utiliza la función fclose().
          <?


PC PASO A PASO Nº 16                                                                                                             Página 7
Programación PHP - Programación PHP - Programación PHP - Programación PHP




               <?
               $fichero1=fopen($fichero1,”r”);
               $fichero2=fopen($fichero2,”r”);
               // Aquí colocamos código para tratar los archivos
               //(leer, modificarlos, ...)
               fclose ($fichero1); // cerramos el fichero1
               fclose ($fichero2); // cerramos el fichero2
               ?>

               Al finalizar el script, PHP cierra todos los ficheros
               abiertos que no han sido cerrados; pero
               esto es una mala práctica ya que durante la
               ejecución del código es posible que se
               corrompan los ficheros con la perdida de datos,
               es por ello que siempre se recomienda cerrar
               los ficheros una vez que ya no se van
                                                                                   Recuerda: la función fpassthru() muestra
               a utilizar.                                                         TODO el contenido de un fichero.

               Al igual que la función fopen() si el proceso
                                                                                   Leer desde un fichero
               de cerrar el fichero se ha ejecutado
               correctamente devolverá el valor TRUE, de no
                                                                                   La mayoría de las veces solo nos interesará
               ser así, devolverá el valor FALSE.
                                                                                   leer una determinada parte del fichero y no
                                                                                   todo como en el ejemplo anterior. PHP ofrece
               Mostrar el contenido de un fichero
                                                                                   diferentes funciones para leer determinadas
                                                                                   partes de un fichero y la elección de la función
               Una vez abierto el fichero ya podemos operar
                                                                                   a utilizar dependerá del dato a leer.
               con él, el siguiente ejemplo es un código que
               muestra el contenido de un fichero, para ello
                                                                                   Para leer una cadena de un fichero abierto, se
               se utiliza la función fpassthru(), utilizando como
                                                                                   utiliza la función fread(), que necesita dos
               argumento el identificador del fichero a abrir.
                                                                                   argumentos, el identificador del fichero abierto
<?
                                                                                   y la cantidad de caracteres a leer. Si se alcanza
$fichero="c:windowsiis6.log"; // fichero en formato texto que se va a abrir.   el final de fichero antes de completar la cantidad
if ($fp=fopen($fichero,"r")) {      // abre el fichero y crea un identificador.    de caracteres indicados, solo devolverá hasta
fpassthru($fp);                     // muestra el contenido del fichero.           ese punto.
} else {
           print ("No se ha podido abrir el fichero");
                                                                                   Por ejemplo, vamos a mostrar los primeros 255
}
?>                                                                                 del fichero iis6.log.
                                                                                   <?
                                                                                   $fichero="c:windowsiis6.log"; //fichero en formato texto que se va a abrir.
               Observa que en fpassrhru() no se ha colocado                        if ($fp=fopen($fichero,"r")) {     // abre el fichero y crea un identificador.
               el nombre del fichero, simplemente se ha                                   $texto=fread($fp,255);      // leemos los primeros 255 caracteres.
                                                                                          print $texto;               // mostramos en pantalla los 255 caracteres.
               indicado el identificador $fp que indica que el
                                                                                   } else {
               fichero está abierto y con permisos de lectura                                  print ("No se ha podido abrir el fichero");
               (“r”).                                                              }
                                                                                   ?>



Página 8                                                                                                                      PC PASO A PASO Nº 16
Programación PHP - Programación PHP - Programación PHP - Programación PHP




                                                                                       al final del fichero. De esta forma podemos
                                                                                       abrir un archivo y leer línea a línea. ¿cómo?,
                                                                                       muy sencillo, en el siguiente código se leerán
                                                                                       10 líneas del fichero y se mostrarán, fíjate que
                                                                                       en fgets() no hemos colocado el número de
                                                                                       caracteres a leer.


                                                                                       <?
     !                Si en tu PC...                                                   $fichero="c:windowsiis6.log";        //fichero en formato texto que se va a abrir
                                                                                       if ($fp=fopen($fichero,"r")) {           // abre el fichero y crea un identificador
                                                                                            for ($cuenta=1;$cuenta<=10;$cuenta=$cuenta+1) {
   Si en tu PC no tienes el fichero iis6.log en c:windows,                                   $caracter=fgets($fp);                  // leemos una linea del archivo
   pues créalo tu mismo con el Block de Notas (o cualquier                                     print "Linea $cuenta del fichero: ".$caracter."<br>"; // muestra la linea del arhivo
   otro editor de texto).                                                                  }
                                                                                       } else {
                                                                                               print ("No se ha podido abrir el fichero");
                   Otra función para leer el contenido de un fichero                   }
                   es fgetc(). A diferencia de la función anterior                     ?>
                   esta lee carácter a carácter. Por ejemplo:


<?
$fichero="c:windowsiis6.log"; //fichero en formato texto que se va a abrir.
if ($fp=fopen($fichero,"r")) {       // abre el fichero y crea un identificador.
$caracter=fgets($fp,1);              // lee carácter a carácter.
           print $carácter;
} else {
           print ("No se ha podido abrir el fichero");
}
?>



                   En este caso solo mostrará un carácter como
                   resultado, aunque también nos ofrece la
                   posibilidad de indicarle que lea una cadena
                                                                                       Otra función similar a fgets() es fgetss(), la
                   indicándole así la longitud.
                                                                                       diferencia es que esta evita leer etiquetas de
                                                                                       lenguajes HTML y PHP.
<?
$fichero="c:windowsiis6.log";     // fichero en formato texto que se va a abrir.   Es una función muy útil si se desea analizar los
if ($fp=fopen($fichero,"r")) {        // abre el fichero y crea un identificador.
                                                                                       textos de una página HTML.
           $caracter=fgets($fp,245); // leemos 245 caracteres.
           print $carácter;
} else {                                                                               Hagamos el siguiente ejemplo, vamos a extraer
           print ("No se ha podido abrir el fichero");                                 los textos de la página principal de www.terra.es,
}
                                                                                       para ello primero copiamos la página index en
?>
                                                                                       nuestra unidad local, ya sabes, ver código fuente
                   La lectura de esta cadena finalizará si el carácter                 y lo copias en tu disco duro. ¿ok?.
                   de retorno de carro es encontrado o si se llega

  PC PASO A PASO Nº 16                                                                                                                                        Página 9
Programación PHP - Programación PHP - Programación PHP - Programación PHP




  !           Copiando la página...                        4.- Comentario: En el código que ejecutaremos a
                                                           continuación, puedes ver que no le especificamos una
                                                           ruta de acceso al archivo terra.html; por lo tanto, se
Copiando la página Web de TERRA en nuestra unidad          buscará el archivo terra.html en la ruta por defecto del
local…                                                     Servidor APACHE, en nuestro caso C:AppServwww

1.- Abrimos nuestro navegador (por ejemplo el Netscape
o el Internet Explorer) y vamos a www.terra.es.
                                                         Venga, ejecutamos el siguiente código:
                                                         <?
2.- Si lo hacemos con el Internet Explorer vamos al
                                                         $fichero="terra.html";              // página principal de Terra.
menú Ver --> Código Fuente                               if ($fp=fopen($fichero,"r")) {     // abre el fichero y crea un identificador.
                                                             for ($cuenta=1;$cuenta<=10000;$cuenta=$cuenta+1) {
                                                             //leemos 10000 lineas si las tiene
                                                             $caracter=fgetss($fp,64000);
                                                             // leemos 64 Kbytes de cada linea y quitamos las etiquetas HTML
                                                             print $caracter;           // mostramos las cadenas sin HTML
                                                         }
                                                         } else {
                                                             print ("No se ha podido abrir el fichero");
                                                         }
                                                         ?>




3.- Nos aparecerá el código en el Block de Notas.
Vamos al menu Archivo --> Guardar Como




Y lo guardamos como terra.html en la ruta por defecto
de nuestro Servidor Web APACHE (en nuestro caso
C:AppServwww)



                                                         Y otra función más para leer ficheros, file(),
                                                         esta función es similar a las anteriores pero
                                                         guarda cada línea leída en una posición dentro
                                                         de un array, siendo la primera línea el elemento
                                                         cero del array.




Página 10                                                                                                   PC PASO A PASO Nº 16
Programación PHP - Programación PHP - Programación PHP - Programación PHP




<?
$fichero="terra.html";                // página principal de Terra.
                                                                                       se encuentra delimitada por algún carácter en especial.
if ($fp=fopen($fichero,"r")) {        // abre el fichero y crea un identificador.
$lineas=file($fp);                                                                     Lo veremos mejor con un ejemplo, fíjate en la siguiente
// lineas es un array, en cada posición se encuentra una linea del fichero leído.      línea:
for ($cuenta=0;$cuenta<count($lineas);$cuenta=$cuenta+1) {
     print (“Linea “.($cuenta+1).”:”.$lineas[$cuenta].”<br>”;                          1,tcp,tcpmux,TCP Port Service Multiplexer [rfc-1078]
     // Mostramos el contenido del array.
}
                                                                                       Esta línea sería un registro dividido en 4 campos,
} else {
print ("No se ha podido abrir el fichero");                                            estando los campos divididos por comas. El delimitador
}                                                                                      en este caso son comas, pero podría ser cualquier
?>                                                                                     cosa, incluso espacios en blanco. Lo importante es
                                                                                       utilizar un identificador único, un identificador que no
               En este pequeño programa hemos utilizado la
                                                                                       se encuentre en el contenido de cada uno de los
               función count(), sirve para averiguar el número
                                                                                       campos.
               de elementos de un array. Utilizando count()
               podemos conocer el número de elementos de
                                                                                       Mismo ejemplo utilizando como delimitador el símbolo #
               la variable $lineas y así poder mostrar cada
               uno de estos. En el número anterior ya se
                                                                                       1#tcp#tcpmux#TCP Port Service Multiplexer [rfc-
               explicó esta función.
                                                                                       1078]
               Y por último la todopoderosa función fgetcsv(),
               esta función es similar a fgets() excepto que
               fgetcsv() analiza la línea buscando campos en
               formato CSV y obtiene un array conteniendo                           El siguiente programa explica como funciona
               los campos leídos. El delimitador de campo es                        la función fgetcscv(), pero no solo eso, ¿sabias
               una coma, a menos que se especifique otro                            que con fopen() podemos conectarnos a un
               delimitador con el tercer parámetro opcional.                        URL y leer su contenido como si de un fichero
                                                                                    se tratara?, increíble pero cierto.
               fgetcsv ( identificador_fichero, longitu, delimitador);

                                                                                    PHP permite lo siguiente:

   !                Una linea en blanco...                                          fopen(“http://www.neohapsis.com/neolabs/neo-
                                                                                    ports/neo-ports.csv”,"r"), es decir, podemos
                                                                                    leer el contenido de cualquier URL, en este
  Una línea en blanco en un fichero CSV se devuelve
  como un array que contiene un único campo nulo, y                                 caso vamos a leer el contenido de un fichero
  esto no será tratado como un error.                                               CSV que se encuentra en el servidor
                                                                                    www.neohapsis.com, ¡¡ no hace falta que el
                                                                                    fichero se encuentre en nuestro disco duro ¡!.
                                                                                    Este fichero remoto contiene la información de
  !                 ¿No sabes lo que es CSV?                                        puertos en CSV (separados por comas). La
                                                                                    función a utilizar es fgetcsv ($fp,1000,",");

 ¿No sabes que es el formato CSV?                                                   E l p r o g ra m a q u e d a r í a c o m o s i g u e :
 Pues el formato CSV es una serie de información que


PC PASO A PASO Nº 16                                                                                                                         Página 11
Programación PHP - Programación PHP - Programación PHP - Programación PHP




                                                                       <?
<?                                                                     $fichero="c:windowsiis6.log"; //fichero en formato texto que se va a abrir.
$fichero="http://www.neohapsis.com/neolabs/neo-ports/neo-ports.csv";   if (file_exists($fichero)) {      // abre el fichero y crea un identificador.
$fp=fopen($fichero,"r");                                               Print (“El fichero existe”);
while ($data = fgetcsv ($fp,1000,",")) {                               }else {
print "Puerto:".$data[0]."&nbsp;&nbsp&nbsp;&nbsp Tipo:".$data[1].      print (“El fichero no existe”);
         "&nbsp;&nbsp&nbsp;&nbsp Descripcion:".$data[3]."<br>";        }
}                                                                      ?>
fclose ($fp);
?>                                                                     Es recomendable siempre que se trabaje con
                                                                       ficheros comprobar la existencia de estos para
                                                                       evitar errores.


                                                                       Escritura en un fichero

                                                                       Escribir en un fichero es la tarea más común
                                                                       cuando se utilizan los ficheros. Básicamente
                                                                       PHP ofrece dos funciones para añadir una
                                                                       cadena de texto a un fichero.

                                                                       Ambas funciones tienen la misma funcionalidad,
                                                                       es decir, que son lo mismo.

                                                                       fputs (identificador,cadena a escribir).
                                                                       Fwrite (identificador, cadena a escribir).

                                                                       Como las demás funciones el primer parámetro
                                                                       es el identificador del fichero abierto al que se
                                                                       le va a añadir la cadena de texto, el segundo
                                                                       parámetro es la cadena de texto a añadir.

                                                                       Como sucede con el resto de funciones si la
                                                                       operación se ha realizado con éxito devolverá
                                                                       TRUE en caso de error devolverá FALSE.

                                                                       Para abrir un fichero como escritura es necesario
                                                                       comunicar el modo “a”, en caso de que se
                                                                       intente añadir texto a un fichero que ha sido
                                                                       abierto en modo de lectura el intérprete de PHP
                                                                       devolverá un mensaje de error.
                                                                       <? $fichero=”fichero.txt”;
                                                                       if ($fd=fopen($fichero,”a”)) {
                                                                       for ($cuenta==1;$cuenta<=10;$cuenta=$cuenta+1) {
               Comprobar si un fichero existe                          fwrite($fd,”Esta es la linea número: $contadorrn”);
                                                                       }
                                                                       } else {
               Se puede comprobar si un fichero existe
                                                                       print (“Error al abrir el fichero.”);
               utilizando la función file_exists().                    }
                                                                       fclose($fd);
                                                                       ?>


Página 12                                                                                                             PC PASO A PASO Nº 16
Programación PHP - Programación PHP - Programación PHP - Programación PHP




          Este programa crea un fichero si no existe y      en un fichero para que en posteriores script
          escribe 10 lineas de texto.                       podamos acceder a las ips sin necesidad de
                                                            volverla a generar.
          Atención: Puede ocurrir que al crear o escribir
          en un fichero te de error por no tener permiso    <?php
          de escritura, la siguiente imagen es un ejemplo   $ipinicio=ip2long("81.35.0.0");
          de ello.                                          $ipfinal=ip2long("81.39.255.255");
                                                            for ($ip=$ipinicio;$ip<=$ipfinal;$ip=$ip+1) {
                                                                      if ($fd=fopen("ips.txt","a")) {
                                                                                fwrite($fd,long2ip($ip)."rn");
                                                                      }
                                                            }
                                                            ?>


                                                            De esta forma se ha creado un fichero llamado
                                                            ps.txt y que contiene todas las IPS, un fichero
                                                            con un tamaño de 4 megas (menudo fichero
                                                            de ips).

          Para evitar este error de permisos hay que dar
                                                            Recorriendo un fichero
          permisos de escritura al directorio, si estás
          utilizando Windows no tendrás problemas pero
                                                            Hasta ahora las funciones que hemos visto
          en caso de Linux seguramente tendrás que
                                                            permiten leer el contenido en su totalidad o
          dar permisos.
                                                            una porción indicada. Puede resultar últil
                                                            moverse por el fichero para leer determinados
          Si tienes todos los permisos correctamente
                                                            puntos o incluso para añadir texto en algunos
          tendrás un nuevo archivo al ejecutar el script,
                                                            lugares del fichero.
          el contenido del fichero es:

                                                            Para recorrer el fichero PHP ofrece nuevas
          Esta   es   la   linea   numero:   1
                                                            funciones, rewind(), coloca la posición del
          Esta   es   la   linea   numero:   2
                                                            puntero de acceso al fichero en la primera
          Esta   es   la   linea   numero:   3
                                                            posición.
          Esta   es   la   linea   numero:   4
          Esta   es   la   linea   numero:   5              <?
          Esta   es   la   linea   numero:   6              $fichero="c:windowsiis6.log"; // fichero en formato texto que se va a abrir.
                                                            if ($fp=fopen($fichero,"r")) {      // abre el fichero y crea un identificador.
          Esta   es   la   linea   numero:   7
                                                            Rewind($fp)                         // Nos situa en la primera posición del fichero.
          Esta   es   la   linea   numero:   8
                                                            } else {
          Esta   es   la   linea   numero:   9              print ("No se ha podido abrir el fichero");
          Esta   es   la   linea   numero:   10             }
                                                            ?>
          Es un ejemplo muy sencillo pero suficiente
                                                            Para situarnos en una posición especifica se
          para ver el funcionamiento. ¿Y ahora?, ¿te
                                                            utiliza la posición fseek(). La función requiere
          acuerdas del script del número anterior? El
                                                            de dos argumentos: como siempre el
          script que estudiamos en el número 15 de PC
                                                            identificador del fichero y el número de
          PASO A PASO generaba un listado de IPs y se
                                                            caracteres que se desea saltar a partir del cual
          mostraba en pantalla. Ahora vamos a modificar
                                                            se comenzará el proceso de lectura o escritura.
          el script para que genere las IPs y se guarden

PC PASO A PASO Nº 16                                                                                                          Página 13
Programación PHP - Programación PHP - Programación PHP - Programación PHP




 <?                                                                                  iis6_copia.log, recuerda que tienes que tener
 $fichero="c:windowsiis6.log"; //fichero en formato texto que se va a abrir.
                                                                                     permisos para copiar ficheros o te ocurrirá lo
 if ($fp=fopen($fichero,"w")) {       // abre el fichero – modo escritura.
                                                                                     mismo que al crearlos.
 fseek($fp,30);                 // Nos situa en el carácter número 30 del fichero.
 fread($fp,40);                // lee 40 caracteres desde la posición número 30.
 } else {                                                                            Para eliminar un fichero, se utiliza la función
 print ("No se ha podido abrir el fichero");                                         unlink().
 }
 ?>
                                                                                     <?
                                                                                     $fichero=”c:iis6_copia.log”;
                Para saber en que posición se encuentra el                           if (unlink($fichero)) {
                puntero se utiliza la función ftell().                               print (“El fichero se ha eliminado con éxito”);
                Si se utiliza la función fseek() puede dar error                     } else {
                si colocamos el puntero en un lugar superior                         print (“El fichero no se ha podido borrar.”);
                al tamaño del fichero, para evitar esto se utiliza                   }
                la función feof() que nos dirá si hemos llegado                      ?>
                al final del fichero.
                                                                                     Para renombrar un fichero se utiliza la función
<?                                                                                   rename() siendo los dos argumentos necesarios,
$fichero="c:windowsiis6.log"; //fichero en formato texto que se va a abrir.
                                                                                     el nombre antiguo del fichero y el nuevo nombre.
 if ($fp=fopen($fichero,"r")) {     // abre el fichero – modo lectura.
While (feof($fp)) {
print (fgetc($fp);                                                                   <?
} else {                                                                             $fichero_antiguo=”c:iis6_copia.log”;
print ("No se ha podido abrir el fichero");                                          $fichero_nuevo==”c:iis6_cambiado.log”;
}                                                                                    rename($fichero_antiguo,$fichero_nuevo);
?>
                                                                                     ?>

                El ejemplo anterior abre el fichero iis6.log y lo                    Atributos de un fichero
                lee carácter a carácter hasta que se llega al
                final indicado por feof().                                           PHP proporciona funciones para obtener
                                                                                     información acerca del propio fichero como el
                                                                                     tamaño, tipo, ...
                Copiar, borrar y renombrar ficheros
                                                                                     filesize() - proporcina el tamaño en bytes de
                Para copiar un fichero se utiliza la función                         un fichero.
                copy(), se necesitan dos argumentos, el primero                      fileatime() - Obtiene la última fecha de acceso
                es el nombre del fichero a copiar y el segundo                       a un fichero.
                argumento es el nombre que se desea colocar                          filectime() - Obtiene la fecha de cambio del
                a la copia del fichero.                                              inode del fichero.
                                                                                     filegroup() - Obtiene el grupo de un fichero.
                <?                                                                   filemtime() - Obtiene la fecha de modificación
                $fichero=”c:windowsiis6.log”;                                    del fichero.
                copy ($fichero,”c:iis6_copia.log”);                                fileperms() - Obtiene los permisos del fichero.
                ?>                                                                   filetype() - Obtiene el tipo de fichero.

                El ejemplo anterior copia un fichero llamado
                iis6.log en otro directorio y con el nombre

Página 14                                                                                                                  PC PASO A PASO Nº 16
Programación PHP - Programación PHP - Programación PHP - Programación PHP




<?php                                                                           Por ahora ya hemos terminado con los ficheros,
$fichero="ips.txt";                                                             practica con ellos, recuerda que experimentar
print "Parámetros del fichero $fichero en Linux<br>";
print "Tamaño del fichero:".filesize($fichero)." Bytes<br>";
                                                                                y ver lo que ocurres es la mejor forma de
print "La última vez que se accedio fue:". fileatime($fichero)."<br>";          aprender, ¿con lo que has aprendido de PHP
print "El inode se cambio el:".filectime($fichero)."<br>";                      hasta ahora serías capaz de programar un
print "El fichero pertenece al grupo:".filegroup($fichero)."<br>";
print "La última vez que se modificó el fichero:".filemtime($fichero)."<br>";   sencillo escaneador de puertos?, pues seguro
print "Los permisos del fichero:".fileperms($fichero)."<br>";                   que sabes, una pista:
print "Tipo del fichero:".filetype($fichero)."<br>";
?>
                                                                                Para saber si una IP tiene el servicio Web
                                                                                bastaría con leer un fichero de la siguiente
                                                                                forma:
                                                                                $fp=fopen(“217.174.193.62:80”,"r"), ¿ves por
                                                                                donde van los tiros?, venga, inténtalo y publica
                                                                                tu escaneador de puertos en el foro de la
                                                                                revista (www.hackxcrack.com).

                                                                                David C.M
Programacion en GNU/LiNUX
                     Programacion del Sistema:
                          El Sistema I.P.C.

                el_chaman.                  Luis U. Rodriguez Paniagua


                   - Damos por terminado el curso de C y damos la bienvenida a la
                     PROGRAMACIÓN DEL SISTEMA.
                   - I.P.C. (Comunicación entre Procesos)
                   - Identificando los procesos y sus dependencias
                   - Creando y Matando procesos


            1. Presentación                                         y www.pcpasoapaso.com. Desde allí también podrás
            Este es el primer artículo de programación de           descargarte el artículo anteriormente citado y muchos otros
            sistema que vamos a ver. El curso básico de             ya liberados.
            C ha terminado oficialmente, pero no vamos          La razón principal de separar este último
            a dejarle por el camino.                            artículo de la serie de artículos que venían
            Tal vez de la impresión de que el curso de C        tratando el lenguaje C es la demanda que
            ha sido rápido y quedan muchas cosas por            muchos lectores han hecho de temas que
            explicar. Ante esto he de aclarar algunos puntos:   se centren más en la programación del
                                                                sistema GNU/LiNUX que en el lenguaje C.
               •    Primero: Existe un artículo que no se
               publicará en la revista que analiza              Esto no quiere decir que:
               pormenorizadamente el código de la matriz              --> lo que vayamos a ver a partir de
               vista en el anterior número, así como otras            ahora sea más difícil. No lo es y trataré
               posibles soluciones. Será "el punto y                  de plasmarlo lo más sencillo posible tal
               seguido" al curso de C.                                y como he hecho hasta la fecha.
                                                                      --> dejemos de lado el lenguaje C. Si se
               Ese artículo está disponible para su descarga          ha dado el lenguaje C ha sido por una
               en http://leonov.servebeer.com:2525                    razón ya citada en anteriores artículos:
               /~luis/descargas.php                                   Va a ser la principal herramienta que
                                                                      usemos para realizar nuestra
                                                                      programación del sistema. Necesitábamos
               Además, en dicha página o en el foro de la             una base sobre esta herramienta y ya la
               revista atenderé gustosamente todas las                tenemos. Es hora de comenzar a utilizarla,
               dudas relativas al curso de programación               tarea que cada día nos acostumbrará
               en C.                                                  más a dicha herramienta: No vamos a
                                                                      dejar de ver el C y las cosas nuevas que
  !            Pa ra     cuando          leas...                      puedan ir surgiendo se comentarán y
                                                                      resaltarán.
  Para cuando leas estas letras, la nueva página Web de la      •   Segundo: Un curso de lenguaje
  revista estará 100% funcional. Podrás acceder                 programación no sirve para nada si no se
  mediante las direcciones www.hackxcrack.com

Página 16                                                                                             PC PASO A PASO Nº 16
Programación bajo Linux - IPC - Programación bajo Linux - IPC - Programación bajo Linux - IPC



             programa. Esto que en principio parece una      El I.P.C. es tan sólo una parte de la
             perogrullada es muy importante: Podemos         programación del sistema, concretamente la
             tener cien cursillos de C bajados de internet   que trata con procesos y la forma en que estos
             y cincuenta libros. Si no hacemos programas,    se comunican entre sí.
             no nos servirán de nada. He procurado ir
                                                             Antes de comenzar a definir algunos conceptos
             explicando conceptos con ejemplos. Una
             vez indicado el camino, sóis vosotros quién     importantes como proceso, voy a explicar
             debéis recorrerlo. Muchos estamos               brevemente porqué he escogido comenzar por
             dispuestos a acompañaros en este camino.        esta parte de la programación del sistema.

             •   Tercero: Insistiendo una vez más, os        La razón por la que empezaremos la
             recuerdo que el que empecemos a dar ya          programación del sistema por el subconjunto
             programación del sistema no quiere decir        I.P.C. en vez de manejo de ficheros y directorios
             que vaya a ser más difícil que lo visto         (ojo que hablamos del manejo de ficheros y
             hasta ahora. Sí anticipo que aparecerán         directorios desde el punto de vista de la
             nuevos conceptos importantísimos a la hora      programación del sistema, no de lo visto en los
             de programar el sistema y que trataré de        primeros números del curso de Linux aunque
             exponerlos lo mejor que pueda.
                                                             sí relacionado), o el subconjunto de llamadas
          Y creo que esto es todo. Esta es la presentación   al kernel, es que es una parte a la vez bastante
          de artículo más larga que he hecho, pero había     atractiva y a la vez bastante peliaguda. Esa
          puntos como el de el artículo anexo a al código    parte nos permitirá realizar programas que
          de la matriz y la terminación un tanto abrupta     exploten las principales características de nuestro
          del curso del lenguaje C que me obligaban a
                                                             S.O.: Multitarea real y comunicaciones en red
          dar una explicación y no abandonar a aquellos
          que han comenzado a aprender este lenguaje         Dicho esto, pasemos a aclarar conceptos
          con esta serie de artículos. Espero que esta       importantísimos para el tema que nos ocupa:
          solución satisfaga tanto a los que quieren
          profundizar un poco más en el lenguaje C           2.1.1. Procesos
          antes de meterse en harina, como a aquellos        Hasta ahora hemos visto en los anteriores
          a los que el curso de C ya se les hacía pesado     artículos como hacer nuestros propios
          por conocido y desean ya darle a la amasadora.
                                                             programas. Estos programas los hemos hecho
          A todos vosotros, un saludo, y muchísimas          utilizando un lenguaje determinado,
          gracias por vuestras críticas y sugerencias.       compilándolos y posteriormente ejecutándolos.
          Este artículo está dedicado a cierto pequeñín      "Ejecutar un programa" es un término con el
          que se le ocurrió nacer en el 2003 y a quienes     que estamos muy familiarizados, pero obviado
          le están cuidando, cuya valentía debería
                                                             en muchas ocasiones. ¿Qué ocurre cuando
          admirarnos a todos.
                                                             ejecutamos un programa? Lo que ocurre es
                                                             que el núcleo carga el archivo ejecutable del
          2. Programación del sistema:
                                                             disco en memoria y le añade cierta información
          El subconjunto I.P.C.                              adicional. En ese momento un programa se ha
                                                             convertido en un proceso.
          2.1. I.P.C. ¿Qué es eso?
          I.P.C. es un acrónimo inglés que corresponde       La información adicional que se le añade a un
          al término Inter Process Comunication              proceso es para que este pueda ser manejado
          (Comunicación Entre Procesos).                     por el núcleo.

PC PASO A PASO Nº 16                                                                                               Página 17
Programación bajo Linux - IPC - Programación bajo Linux - IPC - Programación bajo Linux - IPC




            Tras lo leído, es fácil deducir que un único     Pero antes de llegar ahí, nos queda aún mucho
            ejecutable puede ser llamado varias veces,       camino por recorrer. Por ahora quedémonos
            creado así varios procesos (copias en memoria)   con la idea que refleja dicho gráfico: Un proceso
            que hacen lo mismo pero que son                  no es algo estático, sino que mientras este
            independientes. Será el núcleo el encargado      permanece en memoria ejecutándose, pasa por
            de gestionar como y cuando a un proceso le       diversos estados. La razón de ello es que un
            toca realizar sus funciones.                     proceso no está solo en memoria, sino que
                                                             puede haber simultáneamente muchos procesos,
            El tiempo de vida de un proceso es el
                                                             todos compitiendo por obtener los mismos
            conjunto de estados por los que un proceso
                                                             recursos del sistema (cpu, memoria, disco,
            puede pasar desde que comienza hasta que
                                                             I/O...). El núcleo será el encargado de gestionar
            termina. En un entorno UNiX, los estados por
                                                             qué procesos deben de hace qué y cuando. Es
            los que puede pasar un proceso son:
                                                             lo que se conoce como concurrencia y, como
                                                             veremos en esta serie, también se nos
                                                             suministrarán herramientas (semáforos) que
                                                             nos permitirán gestionar la concurrencia de
                                                             nuestros propios programas si así lo deseamos
                                                             o necesitamos.
                                                             Una manera sencilla de ver los procesos que
                                                             se están ejecutando en nuestro sistema es
                                                             mediante el comando ps. Como este comando
                                                             suele variar ligeramente en sus parámetros en
                                                             distintos sabores UNiX, recomiendo la consulta
                                                             de la página del manual (por ejemplo, en
                                                             GNU/LiNUX, el comando ps –A lista todos los
                                                             procesos del sistema. En *BSD, la orden es ps
                                                             -a y aún así esto no garantiza que se muestren
                                                             todos los procesos, dado que el sistema debe
                                                             de estar configurado para ello.
                                                             Sea como fuere, una salida clásica en GNU/LiNUX
                                                             suele ser:


            Más adelante veremos y explicaremos en mayor     luis@leonov:~$ ps -A
            profundidad la información asociada a este        PID TTY TIME           CMD
            gráfico. Sólo quiero llamar la atención sobre       1 ?     00:00:05    init
            lo que ocurre en el paso 2. Cuando hacemos          2 ?     00:00:00    keventd
            una llamada al sistema, pasaremos a modo            0 ?     00:00:00    ksoftirqd_CPU0
            supervisor para poder realizar operaciones          0 ?     00:00:00    kswapd
            sobre el núcleo en modo supervisor. Este será       0 ?     00:00:00    bdflush
            el principal hueco que aprovecharemos a la          0 ?     00:00:00    kupdated
            hora de comprometer la seguridad de un             10 ?     00:00:00    khubd
            sistema, obteniendo permisos bajo ciertas          11 ?     00:00:11    kjournald
            condiciones que a priori no tiene un usuario      121 ?     00:00:00    kjournald
            "normal".                                         122 ?     00:00:00    kjournald


Página 18                                                                                         PC PASO A PASO Nº 16
Programación bajo Linux - IPC - Programación bajo Linux - IPC - Programación bajo Linux - IPC




 123 ?        00:00:00 kjournald                                   del proceso. Este número es único para cada
 176 ?        00:00:00 eth0                                        proceso y actúa de DNI de cada uno. De esta
 196 ?        00:00:00 dhclient                                    manera el sistema podrá manejar los procesos
 200 ?        00:00:00 eth1                                        utilizando su DNI.
 213 ?        00:00:00 portmap
                                                                   PPID
 503 ?        00:00:05 syslogd
 506 ?        00:00:00 klogd                                       ( Parent Process Identification ) Identificador
 ..........                                                        del proceso padre. En un sistema UNiX los
                                                                   procesos son creados siempre por otros
Para obtener aún más información sobre estos procesos,             procesos. Esto hace que siempre exista una
añadimos el parámetro -f:                                          relación padre-hijo entre ellos y que obtengamos
                                                                   una estructura arbórea de dependencias entre
luis@leonov:~$ ps -Af // En *BSD ps -al
                                                                   procesos.
UID PID PPID C STIME TTY                 TIME CMD
                                                                          Existe un programa llamado pstree que
root      1     0   0 16:42    ?       00:00:05 init [2]                  muestra esta estructura arbórea de
                                                                          dependencias padre-hijo. Suele estar
root      2     1   0 16:42    ?       00:00:00 [keventd]                 disponible en todos los UNiX, pero no se
                                                                          suele instalar por defecto. Hasta donde
root      0     1   0 16:42        ?   00:00:00 [ksoftirqd_CPU0]          se, en Debian se puede instalar mediante
                                                                          apt-get install pstree y en *BSD se
root      0     1   0 16:42    ?       00:00:00 [kswapd]
                                                                          dispone         de     un    port     en
root      0     1   0 16:42    ?       00:00:00 [bdflush]                 /usr/ports/sysutils/pstree/. Sea
                                                                          como fuere, lo podemos descargar de
root      0     1   0 16:42    ?       00:00:00 [kupdated]                ftp://ftp.thp.Uni-Duisburg.DE/pub/source/

root     10     1   0 16:42    ?       00:00:00 [khubd]            He dicho siempre. ¿Seguro? Siempre existirá
                                                                   un único proceso padre de todos los demás. a
root     11    1    0 16:42    ?       00:00:11 [kjournald]
                                                                   la vista del comando ps y pstree, podemos
root 121        1   0 16:43    ?       00:00:00 [kjournald]        decir que este proceso "Adán" es init.

root 122        1   0 16:43    ?       00:00:00 [kjournald]        El resto de los campos de información los
                                                                   ignoraremos por ahora. Con lo visto, debe de
root 123        1   0 16:43    ?       00:00:00 [kjournald]        quedar claro que la información más importante
                                                                   asociada a un proceso será su PID y su PPID.
root 176        1   0 16:43    ?       00:00:00 [eth0]             Estos número que como hemos dicho identifican
                                                                   respectivamente al proceso, y al proceso padre
......
                                                                   del mismo, son números de 16 bits que serán
La información relevante mostrada será:                            asignados secuencialmente por el núcleo cuando
                                                                   se crea un proceso.
UID
                                                                   Cuando programamos, el tipo asociado a un
( User Identification ) Nos muestra qué usuario lanzó ese
                                                                   PID suele ser un entero ( int ). Dado que
proceso.
                                                                   siempre debemos de programar de manera que
PID                                                                nuestro código sea lo más portable posible, se
                                                                   suele emplear el tipo pid_t proporcionado por
( Process Identification ) Nos muestra el número identificador
                                                                   <sys/types.h>.

   PC PASO A PASO Nº 16                                                                                               Página 19
Programación bajo Linux - IPC - Programación bajo Linux - IPC - Programación bajo Linux - IPC




Veamos como podemos hacer que nuestros programas                                                          Los datos pueden variar un poco, pero lo
conozcan su PID y su PPID:                                                                                importante es observar que el PID y el PPID
                                                                                                          coinciden.
///////////////////////////////////////////////////////////////////////////////////////////////////////   Ya sabemos qué es un proceso y sabemos cómo
//                                                                                                        se identifica. A continuación vamos a pasar al
// ARCHIVO: pid.c                                                                                         lado siniestro de los entornos UNiX-like: El
//                                                                                                        comando kill. Este comando sirve para matar
// DESCRIPCIÓN:                                                                                           cualquier proceso que haya creado nuestro
// Este archivo muestra como obtener el PID y el PPID de                                                  usuario ( el usuario root puede matar cualquier
// un programa.                                                                                           proceso del sistema ). Este comando funciona
//                                                                                                        enviando la señal SIGTERM a nuestro proceso,
// COMPILACIÓN:                                                                                           haciendo que este muera de asesinato alevoso.
// gcc -o pid pid.c
//
                                                                                                          Sobre señales hablaremos más adelante, pero
//////////////////////////////////////////////////////////////////////////////////////////////////////
                                                                                                          anticipemos que es el medio de comunicación
                                                                                                          más básico que existe entre procesos. Todos
#include <stdio.h>
                                                                                                          los procesos entienden un "lenguaje" especial
#include <unistd.h>                                                                                       llamado señales. Mediante estas señales que
#include <sys/types.h>                                                                                    son órdenes de este lenguaje, podremos dar
                                                                                                          ciertas órdenes a los procesos. Así que
int main()                                                                                                estrictamente no estamos asesinando un
{                                                                                                         proceso: Le estamos invitando cortésmente a
                                                                                                          que se suicide.
         pid_t mi_pid, pid_papa;
         mi_pid = getpid();
         pid_papa = getppid();                                                                            Vamos a ver esto con un ejemplo:
         printf("n Mi PID es %d y el de mi padre %dn", mi_pid, pid_papa);
                                                                                                          ////////////////////////////////////////////////////////////////
}
                                                                                                          //
Un experimento interesante será el añadir al final del programa                                           // ARCHIVO: pesado.c
mostrado una instrucción como sleep(10);. Esta instrucción                                                //
hace que tras ejecutar nuestro programa, este espere 10m
                                                                                                          // DESCRIPCIN:
segundos para terminar. Si en un terminal ejecutamos este
                                                                                                          // Este archivo nos hará perder la paciencia
programa, y en otro ejecutamos ps con los parámetros
adecuados, podremos ver algo similar a:                                                                   //
                                                                                                          // COMPILACIN:
luis@leonov:~/hxc/articulo9_el_chaman/codigo$ ./pid2
                                                                                                          // gcc -o pesado pesado.c
Mi PID es 24560 y el de mi padre 24490
                                                                                                          //
Y en la otra ventana:                                                                                     ////////////////////////////////////////////////////////////////

luis@leonov:~/hxc/articulo9_el_chaman$ ps -Al
                                                                                                          #include <stdio.h>
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY                                         TIME CMD
                                                                                                          #include <unistd.h>
............
0 S 1004 24560 24490 0 69                0      - 334 126840 pts/3                00:00:00 pid2           #include <sys/types.h>
............


    Página 20                                                                                                                                                    PC PASO A PASO Nº 16
Programación bajo Linux - IPC - Programación bajo Linux - IPC - Programación bajo Linux - IPC




          int main()                                                                       En ocasiones, los procesos se aferran a la vida.
          {                                                                                Son así, qué le vamos a hacer. Entonces
              while(1)                                                                     conviene invocar al comando kill con el
                                                                                           parámetro -9, lo que provocará la ejecución
              {
                                                                                           de un kill que no podrá ser ignorado. Es buena
              printf(" a %d dice: Desisme, ¿qué le pasó al mamut?n", (pid_t)getpid());
                                                                                           costumbre utilizar siempre este parámetro.
              sleep(1);                                                                    Como curiosidad, decir que la salida ahora será:
              }                                                                            ........
          }                                                                                 27972 dice: Desisme, ¿qué le pasó al mamut?

          Este programa es exactamente lo que parece:                                       27972 dice: Desisme, ¿qué le pasó al mamut?
          Un bucle infinito. Este programa repite mientras                                 Terminado (killed)
          cierto, un absurdo mensaje acompañado por
                                                                                           Lo que quiere decir que, esta vez sí, ha sido
          un pitido en el altavoz (secuencia de escape                                     un asesinato y no un suicidio.
          a). Para el que no crea que este programa
                                                                                           Tras leer tanto humor (malo) negro, puede
          no es digno merecedor de su nombre,
                                                                                           parecer que esto de suicidarse y matar es un
          ejecutadlo durante diez minutos. Si pasado un
                                                                                           recurso para hacer entretenido el artículo. Nada
          tiempo no os ha dado un ataque de tics o unas
                                                                                           más lejos de la realidad: No es lo mismo que
          “ligeras” ganas de dejar mudo al ordenador                                       un proceso se mate a él mismo aunque sea
          para siempre, entonces es que tenéis mucha                                       por orden de otros, a que otros lo maten. Es
          paciencia.                                                                       una sutil diferencia que nos debe de hacer
          Una posible salida de este programa será:                                        sospechar que aunque el efecto sea el mismo,
                                                                                           lo que ha ocurrido por debajo no lo es tanto.
          luis@leonov:~/hxc/articulo9_el_chaman/codigo$ ./pesado
                                                                                           Ya lo veremos más adelante.
              27972 dice: Desisme, ¿qué le pasó al mamut?
                                                                                                      En varias ocasiones he visto preguntar
              27972 dice: Desisme, ¿qué le pasó al mamut?
                                                                                                      a la gente si no hay alguna manera para
              27972 dice: Desisme, ¿qué le pasó al mamut?                                             matar los procesos por el nombre del
                                                                                                      programa en vez de por el PID. A priori,
          ........
                                                                                                      con los comandos vistos hasta ahora,
          El número que aparecerá a la izquierda ( en                                                 no. Pero existe un comando llamado skill
          el ejemplo el 27972 ), es el PID del programa.                                              que sí puede hacer esto. Este comando
                                                                                                      tampoco se suele instalar por defecto
          Ahora, desde otro terminal, ejecutemos                                                      pero está disponible en todas las
                                                                                                      distribuciones que conozco. Si por alguna
          luis@leonov:~/hxc/articulo9_el_chaman/codigo$ kill 27972
                                                                                                      razón no lo estuviese, podemos bajarnos
          En el terminal que nos estaba molestando                                                    l a s         f u e n t e s           d e
          aparecerá:                                                                                  ftp://fast.cs.utah.edu/pub/skill/.
          ........
                                                                                           Claro que siempre podemos hacernos nuestra
              27972 dice: Desisme, ¿qué le pasó al mamut?                                  propia versión de skill.... Esto no es una
              27972 dice: Desisme, ¿qué le pasó al mamut?                                  machada, y es un ejercicio muy interesante.
          Terminado                                                                        Para ello disponemos del directorio /proc donde
                                                                                           está la información disponible que nos muestra
          Descanse en paz.                                                                 el comando ps ( ¿Recordáis lo que decíamos


PC PASO A PASO Nº 16                                                                                                                              Página 21
Programación bajo Linux - IPC - Programación bajo Linux - IPC - Programación bajo Linux - IPC




            en los primeros capítulos de que en UNiX TODO            2.1.2. Creación de procesos
            es un archivo? Vamos a verlo. ).
                                                                     A la hora de generar nuestros propios procesos,
            Ejecutemos en un terminal de nuevo el                    tendremos varias posibilidades:
            programa pesado. Ahora tendrá otro PID:
                                                                     system
            luis@leonov:~/hxc/articulo9_el_chaman/codigo$ ./pesado
                                                                     La primera manera de crear nuevos procesos
             28444 dice: Desisme, ¿qué le pasó al mamut?             es invocar a la función system perteneciente a
            ........                                                 la librería estándar de C. Con esta función
                                                                     podremos invocar cualquier comando o programa
            Ahora nos vamos al directorio /proc/28444/,              del sistema que se encuentre en el path. Esta
            que es el lugar donde encontraremos toda la              función, en caso de error, retorna -1. Si no
            información relativa al proceso 28444. Si                puede ejecutar el programa por falta de
            curioseamos un poco por los archivos que nos             permisos, devuelve 127. Un ejemplo:
            encontramos, veremos que se nos da
            información sobre los dispositivos montados,             ////////////////////////////////////////////////////////////////
            la carga de CPU, etc... Es decir, toda la                //
            información que le puede resultar de interés             // ARCHIVO: system.c
            a un proceso. Vemos, además, que existe un
                                                                     //
            archivo llamado cmdline, que contiene el
                                                                     // DESCRIPCIóN:
            nombre del programa correspondiente a dicho
                                                                     // Ejemplo de uso de system
            proceso. Juntando esta información, veremos
                                                                     //
            que es relativamente sencillo hacer un programa
            que obtenga el PID (nombre del directorio)               // COMPILACIÓN:
            de un determinado programa (lo que se                    // gcc -o system system.c
            encuentre en el archivo cmdline) de dicho                //
            directorio. Sería una tarea de ir recorriendo            ////////////////////////////////////////////////////////////////
            todos los directorios, almacenar temporalmente
            el nombre (número) de directorio y ver si lo             #include <stdio.h>
            contenido en el archivo cmdline de dicho                 int main()
            directorio coincide con lo que buscábamos. Si            {
            es así ya tenemos el número de proceso y lo                   int retorno;
            podremos matar. Si no, podemos seguir                         retorno = system("ls -l");
            buscando.
                                                                          return retorno;
            El código de skill podría ayudarnos a realizar           }
            esta tarea, pero si lo echamos un vistazo tal
            vez nos asuste un poco y no podamos identificar          exec
            de un primer vistazo estas tareas. Aún así es            La familia de funciones exec (llamada así porque
            una tarea que recomiendo, sobre todo cuando              no existe una única función exec) nos permitirá
            veamos las señales.                                      ejecutar otros programas desde nuestro propio
            Pero antes de ver señales, para poder trabajar           código. Cuando realizamos una llamada exec,
            más a gusto con ellas, vamos a ver como                  nuestro programa para su ejecución y comienza
            podemos crear nuevos procesos desde nuestros             la ejecución del programa que llamamos
            propios programas. Bienvenidos al apasionante            mediante exec. El programa original deja de
            mundo de la clonación.                                   ser accesible, no pudiendo retornar a él.


Página 22                                                                                                            PC PASO A PASO Nº 16
Programación bajo Linux - IPC - Programación bajo Linux - IPC - Programación bajo Linux - IPC




La familia de funciones exec puede ser clasificada como:                4.- Funciones que contienen la letra e (execve
                                                                        y execle, ambaas vistas).
1.- Funciones que contienen la letra p en sus nombres
(execvp y execlp). Sus declaraciones son:                               Este tipo de funciones poseen un argumento
     • int execvp(char *file, char *argv[]);                            adicional, char *envp[] que contiene las
                                                                        variables de entorno a pasar al programa a
     • int execlp(char *file, char *arg0, char *arg1, ..., char*argN,
      (char *) NULL);                                                   ejecutar.

Este tipo de funciones busca el programa a ejecutar pasado              Tanta variedad principalmente es debida a cómo
a *file en el path. Como veremos ahora, las funciones que               pasamos los argumentos al programa. Y esto
no llevan la letra p en el nombre, requieren que se de la               es importante porque nuestros programas
ruta (path) absoluta al programa a ejecutar.                            también pueden recibir parámetros de la línea
                                                                        de comandos. Como esto en el cursillo de C
*arg0, *arg1, ...., *argN son punteros a cadenas de texto
                                                                        básico se obvió, vamos a explicarlo brevemente
que formarán los argumentos a pasar al programa. Se suele
                                                                        con unos ejemplos.
apuntar *arg0 al nombre del propio programa (donde apunta
*file), y se requiere que el último puntero apunte a NULL.              En ocasiones nos interesará pasar a nuestros
                                                                        programas diversos argumentos. Por ejemplo:
*argv[] será otra forma de representar los argumentos
pasados al programa. Es un vector de cadenas de texto que
                                                                        $ codifica archivo.txt
contiene los parámetros. Por convenio, argv[0] apunta
siempre al nombre del propio programa y argv[N] a NULL                  archivo.txt es un argumento de nuestro
                                                                        programa codifica. Puede ser el nombre de
2.- Funciones que contienen la letra v en sus nombres (La
ya vista execvp más execv y execve. Sus declaraciones                   cualquier archivo. La manera de que "veamos"
son:                                                                    desde dentro del código, el nombre de cualquier
                                                                        archivo, es consultando la lista de argumentos.
     • int execv(char *path, char *argv[]);
                                                                        Esta está disponible en argv[] que es un vector
     • int execve(char *path, char *argv[], char *envp[]);              de cadenas de texto que contendrá tantas
Estas funciones se caracterizan porque los argumentos del               cadenas como argumentos se pasen. Veamos
programa se pasan mediante *argv[] arriba explicado.                    un código que nos muestra sus argumentos:
En cuanto al nuevo parámetro que aparece, *envp[],
representa una lista de variables de entorno que podemos                ////////////////////////////////////////////////////////////////
pasar al nuevo programa. Estas variables de entorno se                  //
pasan como cadenas de texto con el formato                              // ARCHIVO: args.c
VARIABLE=valor. env[N] debe valer NULL.
                                                                        //
3.- Funciones que contienen la letra l (execl, execle y la              // DESCRIPCIÓN:
ya vista execlp. Su declaración es:
                                                                        // Este programa nos muestra el paso de argumentos
     • int execl (char *path, char *arg0, char *arg1, ..., char
                                                                        // por línea de comandos
      *argN, (char *)NULL);
                                                                        //
     • int execle(char *path, char *arg0, char *arg1, ...,
                                                                        // COMPILACIÓN:
      char *argN, (char *)NULL, *envp[]);
                                                                        // gcc -o args args.c
Este tipo de funciones pasa los argumentos del programa
uno a uno, a diferencia del caso anterior que se han de                 //
meter previamente en una lista de argumentos.                           ////////////////////////////////////////////////////////////////


 PC PASO A PASO Nº 16                                                                                                                      Página 23
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16
Hxc16

Weitere ähnliche Inhalte

Ähnlich wie Hxc16 (20)

Hxc17
Hxc17Hxc17
Hxc17
 
Hxc14
Hxc14Hxc14
Hxc14
 
Hxc13
Hxc13Hxc13
Hxc13
 
Hxc18
Hxc18Hxc18
Hxc18
 
Hxc12
Hxc12Hxc12
Hxc12
 
Hxc20
Hxc20Hxc20
Hxc20
 
Hxc23
Hxc23Hxc23
Hxc23
 
Hxc11
Hxc11Hxc11
Hxc11
 
Hx c19
Hx c19Hx c19
Hx c19
 
Hxc10
Hxc10Hxc10
Hxc10
 
Hxc22
Hxc22Hxc22
Hxc22
 
Hxc3
Hxc3Hxc3
Hxc3
 
Hx c17
Hx c17Hx c17
Hx c17
 
Hxc2
Hxc2Hxc2
Hxc2
 
Hxc9
Hxc9Hxc9
Hxc9
 
Users+263 +issuu
Users+263 +issuuUsers+263 +issuu
Users+263 +issuu
 
Hx c18
Hx c18Hx c18
Hx c18
 
Hx c27
Hx c27Hx c27
Hx c27
 
Haichl natalia cantor sanchez 4 y balentina
Haichl natalia cantor sanchez 4  y balentinaHaichl natalia cantor sanchez 4  y balentina
Haichl natalia cantor sanchez 4 y balentina
 
Hx c28
Hx c28Hx c28
Hx c28
 

Mehr von rubenroa

Estudios epidemiologicos
Estudios epidemiologicosEstudios epidemiologicos
Estudios epidemiologicosrubenroa
 
Efectividad de la vacunacion Covid-19 en variante delta
Efectividad de la vacunacion Covid-19 en variante deltaEfectividad de la vacunacion Covid-19 en variante delta
Efectividad de la vacunacion Covid-19 en variante deltarubenroa
 
Causalidad
CausalidadCausalidad
Causalidadrubenroa
 
Evaluacion de tecnologias sanitarias
Evaluacion de tecnologias sanitariasEvaluacion de tecnologias sanitarias
Evaluacion de tecnologias sanitariasrubenroa
 
Epidemiologia
Epidemiologia Epidemiologia
Epidemiologia rubenroa
 
Pediatrics 2008 jul 122(1) 143 8, figure-1
Pediatrics 2008 jul 122(1) 143 8, figure-1Pediatrics 2008 jul 122(1) 143 8, figure-1
Pediatrics 2008 jul 122(1) 143 8, figure-1rubenroa
 
Introducción análisis farmacoepidemiológico sss&farma-taller15jun2011
Introducción análisis farmacoepidemiológico sss&farma-taller15jun2011Introducción análisis farmacoepidemiológico sss&farma-taller15jun2011
Introducción análisis farmacoepidemiológico sss&farma-taller15jun2011rubenroa
 
Maceira sss&farma-taller15jun2011
Maceira sss&farma-taller15jun2011Maceira sss&farma-taller15jun2011
Maceira sss&farma-taller15jun2011rubenroa
 
Datos cohorte chilena sida (1)
Datos cohorte chilena sida (1)Datos cohorte chilena sida (1)
Datos cohorte chilena sida (1)rubenroa
 
Kappos fingolimod moa-clin_results_vfinal_buenosaires1a
Kappos fingolimod moa-clin_results_vfinal_buenosaires1aKappos fingolimod moa-clin_results_vfinal_buenosaires1a
Kappos fingolimod moa-clin_results_vfinal_buenosaires1arubenroa
 
Uso Racional de Medicamentos
Uso Racional de MedicamentosUso Racional de Medicamentos
Uso Racional de Medicamentosrubenroa
 
tabaquismo
tabaquismotabaquismo
tabaquismorubenroa
 
Sesion ppt -2641_
Sesion ppt -2641_Sesion ppt -2641_
Sesion ppt -2641_rubenroa
 
Auditoria em
Auditoria emAuditoria em
Auditoria emrubenroa
 
Indice tobillo brazo
Indice tobillo brazoIndice tobillo brazo
Indice tobillo brazorubenroa
 
indice tobillo brazo
indice tobillo brazoindice tobillo brazo
indice tobillo brazorubenroa
 
Epistemología y paradigmas
Epistemología y paradigmasEpistemología y paradigmas
Epistemología y paradigmasrubenroa
 
Vertigo acv
Vertigo acvVertigo acv
Vertigo acvrubenroa
 
Apendicectomia
ApendicectomiaApendicectomia
Apendicectomiarubenroa
 

Mehr von rubenroa (20)

Estudios epidemiologicos
Estudios epidemiologicosEstudios epidemiologicos
Estudios epidemiologicos
 
Efectividad de la vacunacion Covid-19 en variante delta
Efectividad de la vacunacion Covid-19 en variante deltaEfectividad de la vacunacion Covid-19 en variante delta
Efectividad de la vacunacion Covid-19 en variante delta
 
Causalidad
CausalidadCausalidad
Causalidad
 
Evaluacion de tecnologias sanitarias
Evaluacion de tecnologias sanitariasEvaluacion de tecnologias sanitarias
Evaluacion de tecnologias sanitarias
 
Epidemiologia
Epidemiologia Epidemiologia
Epidemiologia
 
Pediatrics 2008 jul 122(1) 143 8, figure-1
Pediatrics 2008 jul 122(1) 143 8, figure-1Pediatrics 2008 jul 122(1) 143 8, figure-1
Pediatrics 2008 jul 122(1) 143 8, figure-1
 
Introducción análisis farmacoepidemiológico sss&farma-taller15jun2011
Introducción análisis farmacoepidemiológico sss&farma-taller15jun2011Introducción análisis farmacoepidemiológico sss&farma-taller15jun2011
Introducción análisis farmacoepidemiológico sss&farma-taller15jun2011
 
Maceira sss&farma-taller15jun2011
Maceira sss&farma-taller15jun2011Maceira sss&farma-taller15jun2011
Maceira sss&farma-taller15jun2011
 
Datos cohorte chilena sida (1)
Datos cohorte chilena sida (1)Datos cohorte chilena sida (1)
Datos cohorte chilena sida (1)
 
Ferinject
FerinjectFerinject
Ferinject
 
Kappos fingolimod moa-clin_results_vfinal_buenosaires1a
Kappos fingolimod moa-clin_results_vfinal_buenosaires1aKappos fingolimod moa-clin_results_vfinal_buenosaires1a
Kappos fingolimod moa-clin_results_vfinal_buenosaires1a
 
Uso Racional de Medicamentos
Uso Racional de MedicamentosUso Racional de Medicamentos
Uso Racional de Medicamentos
 
tabaquismo
tabaquismotabaquismo
tabaquismo
 
Sesion ppt -2641_
Sesion ppt -2641_Sesion ppt -2641_
Sesion ppt -2641_
 
Auditoria em
Auditoria emAuditoria em
Auditoria em
 
Indice tobillo brazo
Indice tobillo brazoIndice tobillo brazo
Indice tobillo brazo
 
indice tobillo brazo
indice tobillo brazoindice tobillo brazo
indice tobillo brazo
 
Epistemología y paradigmas
Epistemología y paradigmasEpistemología y paradigmas
Epistemología y paradigmas
 
Vertigo acv
Vertigo acvVertigo acv
Vertigo acv
 
Apendicectomia
ApendicectomiaApendicectomia
Apendicectomia
 

Kürzlich hochgeladen

TECNOLOGIA 11-4.8888888888888888888888888
TECNOLOGIA 11-4.8888888888888888888888888TECNOLOGIA 11-4.8888888888888888888888888
TECNOLOGIA 11-4.8888888888888888888888888ElianaValencia28
 
Clasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptxClasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptxCarolina Bujaico
 
TENDENCIAS DE IA Inteligencia artificial generativa.pdf
TENDENCIAS DE IA Inteligencia artificial generativa.pdfTENDENCIAS DE IA Inteligencia artificial generativa.pdf
TENDENCIAS DE IA Inteligencia artificial generativa.pdfJoseAlejandroPerezBa
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersIván López Martín
 
La electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfLa electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfcristianrb0324
 
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024u20211198540
 
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdfBetianaJuarez1
 
Slideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan GerenciaSlideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan Gerenciacubillannoly
 
Actividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolarActividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolar24roberto21
 
Nomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de NóminaNomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de Nóminacuellosameidy
 
TinkerCAD y figuras en 3D. Uso del programa TinkerCAD para crear fuguras.
TinkerCAD y figuras en 3D. Uso del programa TinkerCAD para crear fuguras.TinkerCAD y figuras en 3D. Uso del programa TinkerCAD para crear fuguras.
TinkerCAD y figuras en 3D. Uso del programa TinkerCAD para crear fuguras.radatoro1
 
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptxHugoGutierrez99
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfedepmariaperez
 
Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1ivanapaterninar
 
Trabajo de Tecnología .pdfywhwhejsjsjsjsjsk
Trabajo de Tecnología .pdfywhwhejsjsjsjsjskTrabajo de Tecnología .pdfywhwhejsjsjsjsjsk
Trabajo de Tecnología .pdfywhwhejsjsjsjsjskbydaniela5
 
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docxTALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docxobandopaula444
 
Trabajo de tecnología primer periodo 2024
Trabajo de tecnología primer periodo 2024Trabajo de tecnología primer periodo 2024
Trabajo de tecnología primer periodo 2024anasofiarodriguezcru
 
Herramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfHerramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfKarinaCambero3
 
Trabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointTrabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointValerioIvanDePazLoja
 
tecnologiaactividad11-240323205859-a9b9b9bc.pdf
tecnologiaactividad11-240323205859-a9b9b9bc.pdftecnologiaactividad11-240323205859-a9b9b9bc.pdf
tecnologiaactividad11-240323205859-a9b9b9bc.pdflauralizcano0319
 

Kürzlich hochgeladen (20)

TECNOLOGIA 11-4.8888888888888888888888888
TECNOLOGIA 11-4.8888888888888888888888888TECNOLOGIA 11-4.8888888888888888888888888
TECNOLOGIA 11-4.8888888888888888888888888
 
Clasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptxClasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptx
 
TENDENCIAS DE IA Inteligencia artificial generativa.pdf
TENDENCIAS DE IA Inteligencia artificial generativa.pdfTENDENCIAS DE IA Inteligencia artificial generativa.pdf
TENDENCIAS DE IA Inteligencia artificial generativa.pdf
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 Testcontainers
 
La electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfLa electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdf
 
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
 
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
 
Slideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan GerenciaSlideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan Gerencia
 
Actividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolarActividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolar
 
Nomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de NóminaNomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de Nómina
 
TinkerCAD y figuras en 3D. Uso del programa TinkerCAD para crear fuguras.
TinkerCAD y figuras en 3D. Uso del programa TinkerCAD para crear fuguras.TinkerCAD y figuras en 3D. Uso del programa TinkerCAD para crear fuguras.
TinkerCAD y figuras en 3D. Uso del programa TinkerCAD para crear fuguras.
 
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdf
 
Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1
 
Trabajo de Tecnología .pdfywhwhejsjsjsjsjsk
Trabajo de Tecnología .pdfywhwhejsjsjsjsjskTrabajo de Tecnología .pdfywhwhejsjsjsjsjsk
Trabajo de Tecnología .pdfywhwhejsjsjsjsjsk
 
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docxTALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
 
Trabajo de tecnología primer periodo 2024
Trabajo de tecnología primer periodo 2024Trabajo de tecnología primer periodo 2024
Trabajo de tecnología primer periodo 2024
 
Herramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfHerramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdf
 
Trabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointTrabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power Point
 
tecnologiaactividad11-240323205859-a9b9b9bc.pdf
tecnologiaactividad11-240323205859-a9b9b9bc.pdftecnologiaactividad11-240323205859-a9b9b9bc.pdf
tecnologiaactividad11-240323205859-a9b9b9bc.pdf
 

Hxc16

  • 1. HACK X CRACK: UN SERVIDOR FTP EN LA CONSOLA XBOX --> EVOLUTION X ESTE MES P 16 páginas P A extra!!! A S S O O P A S Oa EN EL PROXIMO NUMERO: HACKEA WINDOWS EN 40 SEGUNDOS P A a a a a a a aa a a a a a NUMERO 16 PROGRAMACION DEL SISTEMA COMUNICACION ENTRE PROCESOS DESTRIPANDO TOCOLOS LOS PROTOCOLOS DE INTERNET HACIENDO COPIAS DE SEGURIDAD DE TUS JUEGOS ULTIMA ENTREGA DEL CURSO Nº 16 -- P.V.P. 4,5 EUROS 00016 8 414090 202756 LOS MEJORES ARTÍCULOS GRATIS EN NUESTRA WEB P C PA S O A PA S O : A B R I E N D O A R C H I V O S R E M O TO S C O N P H P
  • 2.
  • 3. P A S O aa P A S Oaa aa a a aa a a a a a a aa EDITORIAL: EDITOTRANS S.L. Director de la Publicación J. Sentís C.I.F: B43675701 PERE MARTELL Nº 20, 2º - 1ª E-mail contacto 43001 TARRAGONA (ESPAÑA) director@hackxcrack.com Director Editorial Diseño gráfico: I. SENTIS J. M. Velasco E-mail contacto director@editotrans.com E-mail contacto: Título de la publicación Los Cuadernos de HACK X CRACK. grafico@hackxcrack.com Nombre Comercial de la publicacíón PC PASO A PASO Redactores Web: www.hackxcrack.com AZIMUT, ROTEADO, FASTIC, MORDEA, FAUSTO, Dirección: PERE MARTELL Nº 20, 2º - 1ª. ENTROPIC, MEIDOR, HASHIMUIRA, BACKBONE, 43001 TARRAGONA (ESPAÑA) ZORTEMIUS, AK22, DORKAN, KMORK, MAILA, TITINA, SIMPSIM... ... ... ... ... ¿Quieres insertar publicidad en PC PASO A Contacto redactores PASO? Tenemos la mejor relación precio-difusión redactores@hackxcrack.com del mercado editorial en España. Contacta con nosotros!!! Colaboradores Mas de 130 personas: de España, de Brasil, de Director de Marketing Argentina, de Francia, de Alemania, de Japón y Sr. Miguel Mellado algún Estadounidense. Tfno. directo: 652 495 607 Tfno. oficina: 877 023 356 E-mail: miguel@editotrans.com E-mail contacto colaboradores@hackxcrack.com Imprime I.G. PRINTONE S.A. Tel 91 808 50 15 DISTRIBUCIÓN: SGEL, Avda. Valdeparra 29 (Pol. Ind.) 28018 ALCOBENDAS (MADRID) Tel 91 657 69 00 FAX 91 657 69 28 WEB: www.sgel.es TELÉFONO DE ATENCIÓN AL CLIENTE: 977 22 45 80 Petición de Números atrasados y Suscripciones (Srta. Genoveva) HORARIO DE ATENCIÓN: DE 9:30 A 13:30 (LUNES A VIERNES) © Copyright Editotrans S.L. NUMERO 16 -- PRINTED IN SPAIN PERIOCIDAD MENSUAL Deposito legal: B.26805-2002 Código EAN: 8414090202756
  • 4. EDITORIAL el tiempo y las promesas Ante todo una ración de disculpas. Hasta el día 21 de Enero no pudimos tener la WEB operativa al 100% y muchos lectores no pudieron bajarse los programas y artículos liberados. Lamentamos este retraso y no hay excusa que valga, podemos decir que tuvimos problemas 4 EDIT ORIAL con la forma en que el servidor interpretaba nuestra 5 CURSO DE PHP: MANE JO DE F ICHER OS codificación en PHP (cosa que es cierta), pero eso no importa, deberíamos haber tenido La Web al 100% desde 16 PR OGRAMA CION BA JO LINUX: EL SIS T EMA IPC el día 1 de Enero. 29 SER VIDOR DE HXC . MODO DE EMPLE O Otra más… se ha recibido muchas protestas por el mal 30 CURSO XML:DOM (III) funcionamiento de los Servidores de Hack. Azimut ha 42 C ONCURSO DE SUSE LINUX 9.0 estado retocando los protocolos de reinstalación semanal y esperamos que a partir de ahora se cumplan las 43 BA J ATE NUESTR OS L OGOS Y MEL ODIAS reinstalaciones y los servidores se mantengan ON LINE. 43 G AN ADOR DEL C ONCURSO DE SUSE LINUX No obstante, debemos tener en cuenta que los servidores están para ser hackeados y que algunas personas los dejan 43 C OLAB ORA C ON NOSO TR OS inoperativos cuando hacen sus prácticas. 4 4 XB O X (II): EV OL UTION X Otra de las grandes peticiones es que escribamos artículos 55 SERIE RAW (10): USENET de Hacking Básico. Bien, en nuestra opinión el Hacking 79 NUMER OS ATRAS ADOS Básico no existe (o al menos no puede llamarse hacking); pero no podemos ignorar las peticiones de nuestros lectores, 82 SUSCRIPCIONES así que a partir del mes que viene habrá un artículo de Hack-Básico para disfrute del personal. Empezaremos por hackear cualquier sistema Windows NT/2000/XP en 40 segundos (o menos), algo que todo “iniciado” debería saber y, sobretodo, algo que cualquier Administrador de Sistemas debería conocer. Si crees que es imposible fulminar la seguridad de un Windows en 40 segundos, prepárate para el mes que viene!!! ;) GRACIAS una vez más a colaboradores, lectores y foreros. GRACIAS GRACIAS GRACIAS GRACIAS GRACIAS GRACIAS
  • 5. curso de php: Aprende a manejar ficheros con PHP - Trabajando con ficheros y directorios desde PHP - Abriendo ficheros remotos - ¿Qué es CSV? Continuamos con el curso de PHP. En este 1. Abrir el fichero, para ello hay que número aprenderemos a manejar tanto la especificar como se va a abrir. lectura como la escritura. Continuaremos mejorando el programa de generación de IP, 2. La acción sobre el fichero, (escribir o en esta ocasión las IPs en vez de ser leer). presentadas en pantalla serán guardadas en un fichero para su posterior tratamiento. Y 3. Y por último, cerrar el fichero. además aprenderemos a consultar datos de manera remota. Abrir ficheros Para abrir un fichero se utiliza la función fpen(). Manejo de ficheros y directorios. Esta función es muy potente y no tan conocida, pues permite abrir un fichero del servidor vía En una aplicación creada con PHP es posible HTTP o FTP. recuperar datos y guardarlos en ficheros para su posterior tratamiento. Hasta ahora todos Esto último lo veremos más adelante y verás los ejemplos que se han comentado muestran la importancia que tiene (cuando supe que los resultados en el navegador, con lo que una fopen() era capaz de conectarse remotamente vez que se cierra el navegador perdemos los a otras máquinas yo alucinaba). datos generados. Para evitar la perdida de información podemos guardar dichos datos en La sintasix es la siguiente: un archivo para que posteriormente podamos tratarlos. ¿No sería mejor que las IPs generadas fopen (string nombrefichero, string modoApertura); de en el ejemplo del número anterior fueran guardadas en un fichero?, pues eso será lo La cadena nombreFichero debe contener la que haremos. ruta completa para abrir el fichero. PHP ofrece al programador un conjunto de El modoApertura especifica como se debe funciones y procedimientos mediante los cuales abrir el fichero, va asociado al tipo de acción es posible acceder a un fichero de texto para que se desea realizar (escribir,leer). leerlo, modificarlo, añadirle o quitarle líneas. Del mismo modo que podemos tratar ficheros, Si nombreFichero comienza con "http://" (no también podemos manejar directorios, podemos es sensible a mayúsculas), se abre una conexión crear, renombrar y eliminar carpetas. HTTP 1.0 hacia el servidor especificado y se devuelve un apuntador de fichero al comienzo Manejo de ficheros del texto de respuesta. El proceso a seguir para acceder a un fichero, No maneja redirecciones HTTP, por eso se debe sea para consultar el contenido o para incluir una barra final cuando se trata de modificarlo va asociado a 3 pasos: directorios. PC PASO A PASO Nº 16 Página 5
  • 6. Programación PHP - Programación PHP - Programación PHP - Programación PHP Si nombreFichero comienza con "ftp://" (no es sensible a mayúsculas), se abre una conexión ! ¿Como?... ftp hacia el servidor especificado y se devuelve un apuntador al fichero requerido. Si el servidor no soporta ftp en modo pasivo, esto fallará (si ¿Cómo? ¿no sabes ejecutar el código? <? no sabes lo que es FTP en modo pasivo Ufffff, eso es que no has seguido nuestro curso de descárgate gratis el número 1 de esta revista PHP. Tranquilo, puedes pedir los números atrasados desde la Web www.hackxcrack.com). de PC PASO A PASO desde nuestra Web (www.hackxcrack.com) y/o descargarte de forma Se pueden abrir fichero via ftp para leer o para gratuita los artículos liberados. escribir (pero no ambas cosas simultáneamente). <? $fichero=”c:windowsphp.ini”; // fichero que deseamos abrir. if (fopen($fichero,”r”)) { // comprobamos si el fichero se puede abrir para lectura. Existen seis modalidades diferentes para abrir print (“El fichero $fichero se ha podido abrir con éxito”); un fichero: } else { print (“Error al abrir el fichero.”); } ?> En la plataforma Windows, ten cuidado de escribir correctamente las barras invertidas en el path del fichero (poniéndolas dobles), o usa barras directas. También se podría haber colocado el fopen de la siguiente manera con el mismo efecto: if (fopen(”c:windowsphp.ini”,”r”)) { Prueba a cambiar el valor $fichero, para que puedas comprobar ambos resultados. Experimenta con las barras inclinadas, por norma se suele utilizar las barras dobles. En el ejemplo damos por supuesto que el fichero existe, en caso de que el fichero no exista dará error de PHP. El último valor de la tabla será ignorado en sistemas Unix/Linux ya que no existe distinción entre este tipo de fichero por lo que el valor será ignorado. Primer ejemplo: Vamos a comenzar con un sencillo ejemplo. Ejecuta el siguiente código, el cual abre el fichero php.ini, situado en la ruta c:windowsphp.ini, con operación de lectura (valor: r). Resultado de abrir el fichero “php.ini” con la función fopen() Página 6 PC PASO A PASO Nº 16
  • 7. Programación PHP - Programación PHP - Programación PHP - Programación PHP <? $fichero=”c:windowsphppp.ini”; // Introducimos un error en el nombre del fichero fopen($fichero,”r”) or die (“El fichero no se ha podido abrir.”); ?> Con este código tenemos el siguiente resultado: Resultado al abrir el fichero con un error ¿Cuándo puede dar error al abrir un fichero?, si el fichero está abierto por otra aplicación puede que tenga todos los privilegios y no permita abrir el fichero a otros programas, por lo que tendremos que esperar a que la aplicación deje de utilizar el archivo. Como se puede ver en la imagen el fichero no se ha encontrado y aparece el mensaje “El En el ejemplo se abre el fichero php.ini para fichero no se ha podido abrir”, pero sigue su lectura tal y como indica el valor “r”. apareciendo un mensaje de WARNING, por lo que seguimos mostrando una alerta de PHP y Si se consigue abrir la función fopen devolverá lógicamente no deseamos que se vea el el valor TRUE y FALSE en caso de que no haya WARNING, ¿qué se puede hacer?. sido posible abrir el archivo para lectura. Simplemente añadiendo el simbolo @ a fopen, La función fopen() devuelve un identificador ¿cómo?, pues como indica el siguiente ejemplo: creado al abrir el fichero y que será necesario <? para utilizar las funciones de escribir y leer el $fichero=”c:windowsphppp.ini”; //Introducimos un error en el nombre del fichero. fichero. @fopen($fichero,”r”) or die (“El fichero no se ha podido abrir.”); ?> Para capturar el identificador (también llamado El símbolo puede añadirse a cualquier función hadler) se podría haber utilizado la siguiente para evitar que se vean los WARNING, sintaxis: lógicamente existen soluciones mejores, lo veremos más adelante. $fi=fopen($fichero,"r"); // la variable $fi // tomará el valor que hace referencia al fichero Cerrar ficheros Con fopen() también podemos utilizar la Una vez que han finalizado las tareas con el función die(). Envía un mensaje y finaliza la fichero es recomendable cerrar el archivo. Para ejecución del script. ello, se utiliza la función fclose(). <? PC PASO A PASO Nº 16 Página 7
  • 8. Programación PHP - Programación PHP - Programación PHP - Programación PHP <? $fichero1=fopen($fichero1,”r”); $fichero2=fopen($fichero2,”r”); // Aquí colocamos código para tratar los archivos //(leer, modificarlos, ...) fclose ($fichero1); // cerramos el fichero1 fclose ($fichero2); // cerramos el fichero2 ?> Al finalizar el script, PHP cierra todos los ficheros abiertos que no han sido cerrados; pero esto es una mala práctica ya que durante la ejecución del código es posible que se corrompan los ficheros con la perdida de datos, es por ello que siempre se recomienda cerrar los ficheros una vez que ya no se van Recuerda: la función fpassthru() muestra a utilizar. TODO el contenido de un fichero. Al igual que la función fopen() si el proceso Leer desde un fichero de cerrar el fichero se ha ejecutado correctamente devolverá el valor TRUE, de no La mayoría de las veces solo nos interesará ser así, devolverá el valor FALSE. leer una determinada parte del fichero y no todo como en el ejemplo anterior. PHP ofrece Mostrar el contenido de un fichero diferentes funciones para leer determinadas partes de un fichero y la elección de la función Una vez abierto el fichero ya podemos operar a utilizar dependerá del dato a leer. con él, el siguiente ejemplo es un código que muestra el contenido de un fichero, para ello Para leer una cadena de un fichero abierto, se se utiliza la función fpassthru(), utilizando como utiliza la función fread(), que necesita dos argumento el identificador del fichero a abrir. argumentos, el identificador del fichero abierto <? y la cantidad de caracteres a leer. Si se alcanza $fichero="c:windowsiis6.log"; // fichero en formato texto que se va a abrir. el final de fichero antes de completar la cantidad if ($fp=fopen($fichero,"r")) { // abre el fichero y crea un identificador. de caracteres indicados, solo devolverá hasta fpassthru($fp); // muestra el contenido del fichero. ese punto. } else { print ("No se ha podido abrir el fichero"); Por ejemplo, vamos a mostrar los primeros 255 } ?> del fichero iis6.log. <? $fichero="c:windowsiis6.log"; //fichero en formato texto que se va a abrir. Observa que en fpassrhru() no se ha colocado if ($fp=fopen($fichero,"r")) { // abre el fichero y crea un identificador. el nombre del fichero, simplemente se ha $texto=fread($fp,255); // leemos los primeros 255 caracteres. print $texto; // mostramos en pantalla los 255 caracteres. indicado el identificador $fp que indica que el } else { fichero está abierto y con permisos de lectura print ("No se ha podido abrir el fichero"); (“r”). } ?> Página 8 PC PASO A PASO Nº 16
  • 9. Programación PHP - Programación PHP - Programación PHP - Programación PHP al final del fichero. De esta forma podemos abrir un archivo y leer línea a línea. ¿cómo?, muy sencillo, en el siguiente código se leerán 10 líneas del fichero y se mostrarán, fíjate que en fgets() no hemos colocado el número de caracteres a leer. <? ! Si en tu PC... $fichero="c:windowsiis6.log"; //fichero en formato texto que se va a abrir if ($fp=fopen($fichero,"r")) { // abre el fichero y crea un identificador for ($cuenta=1;$cuenta<=10;$cuenta=$cuenta+1) { Si en tu PC no tienes el fichero iis6.log en c:windows, $caracter=fgets($fp); // leemos una linea del archivo pues créalo tu mismo con el Block de Notas (o cualquier print "Linea $cuenta del fichero: ".$caracter."<br>"; // muestra la linea del arhivo otro editor de texto). } } else { print ("No se ha podido abrir el fichero"); Otra función para leer el contenido de un fichero } es fgetc(). A diferencia de la función anterior ?> esta lee carácter a carácter. Por ejemplo: <? $fichero="c:windowsiis6.log"; //fichero en formato texto que se va a abrir. if ($fp=fopen($fichero,"r")) { // abre el fichero y crea un identificador. $caracter=fgets($fp,1); // lee carácter a carácter. print $carácter; } else { print ("No se ha podido abrir el fichero"); } ?> En este caso solo mostrará un carácter como resultado, aunque también nos ofrece la posibilidad de indicarle que lea una cadena Otra función similar a fgets() es fgetss(), la indicándole así la longitud. diferencia es que esta evita leer etiquetas de lenguajes HTML y PHP. <? $fichero="c:windowsiis6.log"; // fichero en formato texto que se va a abrir. Es una función muy útil si se desea analizar los if ($fp=fopen($fichero,"r")) { // abre el fichero y crea un identificador. textos de una página HTML. $caracter=fgets($fp,245); // leemos 245 caracteres. print $carácter; } else { Hagamos el siguiente ejemplo, vamos a extraer print ("No se ha podido abrir el fichero"); los textos de la página principal de www.terra.es, } para ello primero copiamos la página index en ?> nuestra unidad local, ya sabes, ver código fuente La lectura de esta cadena finalizará si el carácter y lo copias en tu disco duro. ¿ok?. de retorno de carro es encontrado o si se llega PC PASO A PASO Nº 16 Página 9
  • 10. Programación PHP - Programación PHP - Programación PHP - Programación PHP ! Copiando la página... 4.- Comentario: En el código que ejecutaremos a continuación, puedes ver que no le especificamos una ruta de acceso al archivo terra.html; por lo tanto, se Copiando la página Web de TERRA en nuestra unidad buscará el archivo terra.html en la ruta por defecto del local… Servidor APACHE, en nuestro caso C:AppServwww 1.- Abrimos nuestro navegador (por ejemplo el Netscape o el Internet Explorer) y vamos a www.terra.es. Venga, ejecutamos el siguiente código: <? 2.- Si lo hacemos con el Internet Explorer vamos al $fichero="terra.html"; // página principal de Terra. menú Ver --> Código Fuente if ($fp=fopen($fichero,"r")) { // abre el fichero y crea un identificador. for ($cuenta=1;$cuenta<=10000;$cuenta=$cuenta+1) { //leemos 10000 lineas si las tiene $caracter=fgetss($fp,64000); // leemos 64 Kbytes de cada linea y quitamos las etiquetas HTML print $caracter; // mostramos las cadenas sin HTML } } else { print ("No se ha podido abrir el fichero"); } ?> 3.- Nos aparecerá el código en el Block de Notas. Vamos al menu Archivo --> Guardar Como Y lo guardamos como terra.html en la ruta por defecto de nuestro Servidor Web APACHE (en nuestro caso C:AppServwww) Y otra función más para leer ficheros, file(), esta función es similar a las anteriores pero guarda cada línea leída en una posición dentro de un array, siendo la primera línea el elemento cero del array. Página 10 PC PASO A PASO Nº 16
  • 11. Programación PHP - Programación PHP - Programación PHP - Programación PHP <? $fichero="terra.html"; // página principal de Terra. se encuentra delimitada por algún carácter en especial. if ($fp=fopen($fichero,"r")) { // abre el fichero y crea un identificador. $lineas=file($fp); Lo veremos mejor con un ejemplo, fíjate en la siguiente // lineas es un array, en cada posición se encuentra una linea del fichero leído. línea: for ($cuenta=0;$cuenta<count($lineas);$cuenta=$cuenta+1) { print (“Linea “.($cuenta+1).”:”.$lineas[$cuenta].”<br>”; 1,tcp,tcpmux,TCP Port Service Multiplexer [rfc-1078] // Mostramos el contenido del array. } Esta línea sería un registro dividido en 4 campos, } else { print ("No se ha podido abrir el fichero"); estando los campos divididos por comas. El delimitador } en este caso son comas, pero podría ser cualquier ?> cosa, incluso espacios en blanco. Lo importante es utilizar un identificador único, un identificador que no En este pequeño programa hemos utilizado la se encuentre en el contenido de cada uno de los función count(), sirve para averiguar el número campos. de elementos de un array. Utilizando count() podemos conocer el número de elementos de Mismo ejemplo utilizando como delimitador el símbolo # la variable $lineas y así poder mostrar cada uno de estos. En el número anterior ya se 1#tcp#tcpmux#TCP Port Service Multiplexer [rfc- explicó esta función. 1078] Y por último la todopoderosa función fgetcsv(), esta función es similar a fgets() excepto que fgetcsv() analiza la línea buscando campos en formato CSV y obtiene un array conteniendo El siguiente programa explica como funciona los campos leídos. El delimitador de campo es la función fgetcscv(), pero no solo eso, ¿sabias una coma, a menos que se especifique otro que con fopen() podemos conectarnos a un delimitador con el tercer parámetro opcional. URL y leer su contenido como si de un fichero se tratara?, increíble pero cierto. fgetcsv ( identificador_fichero, longitu, delimitador); PHP permite lo siguiente: ! Una linea en blanco... fopen(“http://www.neohapsis.com/neolabs/neo- ports/neo-ports.csv”,"r"), es decir, podemos leer el contenido de cualquier URL, en este Una línea en blanco en un fichero CSV se devuelve como un array que contiene un único campo nulo, y caso vamos a leer el contenido de un fichero esto no será tratado como un error. CSV que se encuentra en el servidor www.neohapsis.com, ¡¡ no hace falta que el fichero se encuentre en nuestro disco duro ¡!. Este fichero remoto contiene la información de ! ¿No sabes lo que es CSV? puertos en CSV (separados por comas). La función a utilizar es fgetcsv ($fp,1000,","); ¿No sabes que es el formato CSV? E l p r o g ra m a q u e d a r í a c o m o s i g u e : Pues el formato CSV es una serie de información que PC PASO A PASO Nº 16 Página 11
  • 12. Programación PHP - Programación PHP - Programación PHP - Programación PHP <? <? $fichero="c:windowsiis6.log"; //fichero en formato texto que se va a abrir. $fichero="http://www.neohapsis.com/neolabs/neo-ports/neo-ports.csv"; if (file_exists($fichero)) { // abre el fichero y crea un identificador. $fp=fopen($fichero,"r"); Print (“El fichero existe”); while ($data = fgetcsv ($fp,1000,",")) { }else { print "Puerto:".$data[0]."&nbsp;&nbsp&nbsp;&nbsp Tipo:".$data[1]. print (“El fichero no existe”); "&nbsp;&nbsp&nbsp;&nbsp Descripcion:".$data[3]."<br>"; } } ?> fclose ($fp); ?> Es recomendable siempre que se trabaje con ficheros comprobar la existencia de estos para evitar errores. Escritura en un fichero Escribir en un fichero es la tarea más común cuando se utilizan los ficheros. Básicamente PHP ofrece dos funciones para añadir una cadena de texto a un fichero. Ambas funciones tienen la misma funcionalidad, es decir, que son lo mismo. fputs (identificador,cadena a escribir). Fwrite (identificador, cadena a escribir). Como las demás funciones el primer parámetro es el identificador del fichero abierto al que se le va a añadir la cadena de texto, el segundo parámetro es la cadena de texto a añadir. Como sucede con el resto de funciones si la operación se ha realizado con éxito devolverá TRUE en caso de error devolverá FALSE. Para abrir un fichero como escritura es necesario comunicar el modo “a”, en caso de que se intente añadir texto a un fichero que ha sido abierto en modo de lectura el intérprete de PHP devolverá un mensaje de error. <? $fichero=”fichero.txt”; if ($fd=fopen($fichero,”a”)) { for ($cuenta==1;$cuenta<=10;$cuenta=$cuenta+1) { Comprobar si un fichero existe fwrite($fd,”Esta es la linea número: $contadorrn”); } } else { Se puede comprobar si un fichero existe print (“Error al abrir el fichero.”); utilizando la función file_exists(). } fclose($fd); ?> Página 12 PC PASO A PASO Nº 16
  • 13. Programación PHP - Programación PHP - Programación PHP - Programación PHP Este programa crea un fichero si no existe y en un fichero para que en posteriores script escribe 10 lineas de texto. podamos acceder a las ips sin necesidad de volverla a generar. Atención: Puede ocurrir que al crear o escribir en un fichero te de error por no tener permiso <?php de escritura, la siguiente imagen es un ejemplo $ipinicio=ip2long("81.35.0.0"); de ello. $ipfinal=ip2long("81.39.255.255"); for ($ip=$ipinicio;$ip<=$ipfinal;$ip=$ip+1) { if ($fd=fopen("ips.txt","a")) { fwrite($fd,long2ip($ip)."rn"); } } ?> De esta forma se ha creado un fichero llamado ps.txt y que contiene todas las IPS, un fichero con un tamaño de 4 megas (menudo fichero de ips). Para evitar este error de permisos hay que dar Recorriendo un fichero permisos de escritura al directorio, si estás utilizando Windows no tendrás problemas pero Hasta ahora las funciones que hemos visto en caso de Linux seguramente tendrás que permiten leer el contenido en su totalidad o dar permisos. una porción indicada. Puede resultar últil moverse por el fichero para leer determinados Si tienes todos los permisos correctamente puntos o incluso para añadir texto en algunos tendrás un nuevo archivo al ejecutar el script, lugares del fichero. el contenido del fichero es: Para recorrer el fichero PHP ofrece nuevas Esta es la linea numero: 1 funciones, rewind(), coloca la posición del Esta es la linea numero: 2 puntero de acceso al fichero en la primera Esta es la linea numero: 3 posición. Esta es la linea numero: 4 Esta es la linea numero: 5 <? Esta es la linea numero: 6 $fichero="c:windowsiis6.log"; // fichero en formato texto que se va a abrir. if ($fp=fopen($fichero,"r")) { // abre el fichero y crea un identificador. Esta es la linea numero: 7 Rewind($fp) // Nos situa en la primera posición del fichero. Esta es la linea numero: 8 } else { Esta es la linea numero: 9 print ("No se ha podido abrir el fichero"); Esta es la linea numero: 10 } ?> Es un ejemplo muy sencillo pero suficiente Para situarnos en una posición especifica se para ver el funcionamiento. ¿Y ahora?, ¿te utiliza la posición fseek(). La función requiere acuerdas del script del número anterior? El de dos argumentos: como siempre el script que estudiamos en el número 15 de PC identificador del fichero y el número de PASO A PASO generaba un listado de IPs y se caracteres que se desea saltar a partir del cual mostraba en pantalla. Ahora vamos a modificar se comenzará el proceso de lectura o escritura. el script para que genere las IPs y se guarden PC PASO A PASO Nº 16 Página 13
  • 14. Programación PHP - Programación PHP - Programación PHP - Programación PHP <? iis6_copia.log, recuerda que tienes que tener $fichero="c:windowsiis6.log"; //fichero en formato texto que se va a abrir. permisos para copiar ficheros o te ocurrirá lo if ($fp=fopen($fichero,"w")) { // abre el fichero – modo escritura. mismo que al crearlos. fseek($fp,30); // Nos situa en el carácter número 30 del fichero. fread($fp,40); // lee 40 caracteres desde la posición número 30. } else { Para eliminar un fichero, se utiliza la función print ("No se ha podido abrir el fichero"); unlink(). } ?> <? $fichero=”c:iis6_copia.log”; Para saber en que posición se encuentra el if (unlink($fichero)) { puntero se utiliza la función ftell(). print (“El fichero se ha eliminado con éxito”); Si se utiliza la función fseek() puede dar error } else { si colocamos el puntero en un lugar superior print (“El fichero no se ha podido borrar.”); al tamaño del fichero, para evitar esto se utiliza } la función feof() que nos dirá si hemos llegado ?> al final del fichero. Para renombrar un fichero se utiliza la función <? rename() siendo los dos argumentos necesarios, $fichero="c:windowsiis6.log"; //fichero en formato texto que se va a abrir. el nombre antiguo del fichero y el nuevo nombre. if ($fp=fopen($fichero,"r")) { // abre el fichero – modo lectura. While (feof($fp)) { print (fgetc($fp); <? } else { $fichero_antiguo=”c:iis6_copia.log”; print ("No se ha podido abrir el fichero"); $fichero_nuevo==”c:iis6_cambiado.log”; } rename($fichero_antiguo,$fichero_nuevo); ?> ?> El ejemplo anterior abre el fichero iis6.log y lo Atributos de un fichero lee carácter a carácter hasta que se llega al final indicado por feof(). PHP proporciona funciones para obtener información acerca del propio fichero como el tamaño, tipo, ... Copiar, borrar y renombrar ficheros filesize() - proporcina el tamaño en bytes de Para copiar un fichero se utiliza la función un fichero. copy(), se necesitan dos argumentos, el primero fileatime() - Obtiene la última fecha de acceso es el nombre del fichero a copiar y el segundo a un fichero. argumento es el nombre que se desea colocar filectime() - Obtiene la fecha de cambio del a la copia del fichero. inode del fichero. filegroup() - Obtiene el grupo de un fichero. <? filemtime() - Obtiene la fecha de modificación $fichero=”c:windowsiis6.log”; del fichero. copy ($fichero,”c:iis6_copia.log”); fileperms() - Obtiene los permisos del fichero. ?> filetype() - Obtiene el tipo de fichero. El ejemplo anterior copia un fichero llamado iis6.log en otro directorio y con el nombre Página 14 PC PASO A PASO Nº 16
  • 15. Programación PHP - Programación PHP - Programación PHP - Programación PHP <?php Por ahora ya hemos terminado con los ficheros, $fichero="ips.txt"; practica con ellos, recuerda que experimentar print "Parámetros del fichero $fichero en Linux<br>"; print "Tamaño del fichero:".filesize($fichero)." Bytes<br>"; y ver lo que ocurres es la mejor forma de print "La última vez que se accedio fue:". fileatime($fichero)."<br>"; aprender, ¿con lo que has aprendido de PHP print "El inode se cambio el:".filectime($fichero)."<br>"; hasta ahora serías capaz de programar un print "El fichero pertenece al grupo:".filegroup($fichero)."<br>"; print "La última vez que se modificó el fichero:".filemtime($fichero)."<br>"; sencillo escaneador de puertos?, pues seguro print "Los permisos del fichero:".fileperms($fichero)."<br>"; que sabes, una pista: print "Tipo del fichero:".filetype($fichero)."<br>"; ?> Para saber si una IP tiene el servicio Web bastaría con leer un fichero de la siguiente forma: $fp=fopen(“217.174.193.62:80”,"r"), ¿ves por donde van los tiros?, venga, inténtalo y publica tu escaneador de puertos en el foro de la revista (www.hackxcrack.com). David C.M
  • 16. Programacion en GNU/LiNUX Programacion del Sistema: El Sistema I.P.C. el_chaman. Luis U. Rodriguez Paniagua - Damos por terminado el curso de C y damos la bienvenida a la PROGRAMACIÓN DEL SISTEMA. - I.P.C. (Comunicación entre Procesos) - Identificando los procesos y sus dependencias - Creando y Matando procesos 1. Presentación y www.pcpasoapaso.com. Desde allí también podrás Este es el primer artículo de programación de descargarte el artículo anteriormente citado y muchos otros sistema que vamos a ver. El curso básico de ya liberados. C ha terminado oficialmente, pero no vamos La razón principal de separar este último a dejarle por el camino. artículo de la serie de artículos que venían Tal vez de la impresión de que el curso de C tratando el lenguaje C es la demanda que ha sido rápido y quedan muchas cosas por muchos lectores han hecho de temas que explicar. Ante esto he de aclarar algunos puntos: se centren más en la programación del sistema GNU/LiNUX que en el lenguaje C. • Primero: Existe un artículo que no se publicará en la revista que analiza Esto no quiere decir que: pormenorizadamente el código de la matriz --> lo que vayamos a ver a partir de vista en el anterior número, así como otras ahora sea más difícil. No lo es y trataré posibles soluciones. Será "el punto y de plasmarlo lo más sencillo posible tal seguido" al curso de C. y como he hecho hasta la fecha. --> dejemos de lado el lenguaje C. Si se Ese artículo está disponible para su descarga ha dado el lenguaje C ha sido por una en http://leonov.servebeer.com:2525 razón ya citada en anteriores artículos: /~luis/descargas.php Va a ser la principal herramienta que usemos para realizar nuestra programación del sistema. Necesitábamos Además, en dicha página o en el foro de la una base sobre esta herramienta y ya la revista atenderé gustosamente todas las tenemos. Es hora de comenzar a utilizarla, dudas relativas al curso de programación tarea que cada día nos acostumbrará en C. más a dicha herramienta: No vamos a dejar de ver el C y las cosas nuevas que ! Pa ra cuando leas... puedan ir surgiendo se comentarán y resaltarán. Para cuando leas estas letras, la nueva página Web de la • Segundo: Un curso de lenguaje revista estará 100% funcional. Podrás acceder programación no sirve para nada si no se mediante las direcciones www.hackxcrack.com Página 16 PC PASO A PASO Nº 16
  • 17. Programación bajo Linux - IPC - Programación bajo Linux - IPC - Programación bajo Linux - IPC programa. Esto que en principio parece una El I.P.C. es tan sólo una parte de la perogrullada es muy importante: Podemos programación del sistema, concretamente la tener cien cursillos de C bajados de internet que trata con procesos y la forma en que estos y cincuenta libros. Si no hacemos programas, se comunican entre sí. no nos servirán de nada. He procurado ir Antes de comenzar a definir algunos conceptos explicando conceptos con ejemplos. Una vez indicado el camino, sóis vosotros quién importantes como proceso, voy a explicar debéis recorrerlo. Muchos estamos brevemente porqué he escogido comenzar por dispuestos a acompañaros en este camino. esta parte de la programación del sistema. • Tercero: Insistiendo una vez más, os La razón por la que empezaremos la recuerdo que el que empecemos a dar ya programación del sistema por el subconjunto programación del sistema no quiere decir I.P.C. en vez de manejo de ficheros y directorios que vaya a ser más difícil que lo visto (ojo que hablamos del manejo de ficheros y hasta ahora. Sí anticipo que aparecerán directorios desde el punto de vista de la nuevos conceptos importantísimos a la hora programación del sistema, no de lo visto en los de programar el sistema y que trataré de primeros números del curso de Linux aunque exponerlos lo mejor que pueda. sí relacionado), o el subconjunto de llamadas Y creo que esto es todo. Esta es la presentación al kernel, es que es una parte a la vez bastante de artículo más larga que he hecho, pero había atractiva y a la vez bastante peliaguda. Esa puntos como el de el artículo anexo a al código parte nos permitirá realizar programas que de la matriz y la terminación un tanto abrupta exploten las principales características de nuestro del curso del lenguaje C que me obligaban a S.O.: Multitarea real y comunicaciones en red dar una explicación y no abandonar a aquellos que han comenzado a aprender este lenguaje Dicho esto, pasemos a aclarar conceptos con esta serie de artículos. Espero que esta importantísimos para el tema que nos ocupa: solución satisfaga tanto a los que quieren profundizar un poco más en el lenguaje C 2.1.1. Procesos antes de meterse en harina, como a aquellos Hasta ahora hemos visto en los anteriores a los que el curso de C ya se les hacía pesado artículos como hacer nuestros propios por conocido y desean ya darle a la amasadora. programas. Estos programas los hemos hecho A todos vosotros, un saludo, y muchísimas utilizando un lenguaje determinado, gracias por vuestras críticas y sugerencias. compilándolos y posteriormente ejecutándolos. Este artículo está dedicado a cierto pequeñín "Ejecutar un programa" es un término con el que se le ocurrió nacer en el 2003 y a quienes que estamos muy familiarizados, pero obviado le están cuidando, cuya valentía debería en muchas ocasiones. ¿Qué ocurre cuando admirarnos a todos. ejecutamos un programa? Lo que ocurre es que el núcleo carga el archivo ejecutable del 2. Programación del sistema: disco en memoria y le añade cierta información El subconjunto I.P.C. adicional. En ese momento un programa se ha convertido en un proceso. 2.1. I.P.C. ¿Qué es eso? I.P.C. es un acrónimo inglés que corresponde La información adicional que se le añade a un al término Inter Process Comunication proceso es para que este pueda ser manejado (Comunicación Entre Procesos). por el núcleo. PC PASO A PASO Nº 16 Página 17
  • 18. Programación bajo Linux - IPC - Programación bajo Linux - IPC - Programación bajo Linux - IPC Tras lo leído, es fácil deducir que un único Pero antes de llegar ahí, nos queda aún mucho ejecutable puede ser llamado varias veces, camino por recorrer. Por ahora quedémonos creado así varios procesos (copias en memoria) con la idea que refleja dicho gráfico: Un proceso que hacen lo mismo pero que son no es algo estático, sino que mientras este independientes. Será el núcleo el encargado permanece en memoria ejecutándose, pasa por de gestionar como y cuando a un proceso le diversos estados. La razón de ello es que un toca realizar sus funciones. proceso no está solo en memoria, sino que puede haber simultáneamente muchos procesos, El tiempo de vida de un proceso es el todos compitiendo por obtener los mismos conjunto de estados por los que un proceso recursos del sistema (cpu, memoria, disco, puede pasar desde que comienza hasta que I/O...). El núcleo será el encargado de gestionar termina. En un entorno UNiX, los estados por qué procesos deben de hace qué y cuando. Es los que puede pasar un proceso son: lo que se conoce como concurrencia y, como veremos en esta serie, también se nos suministrarán herramientas (semáforos) que nos permitirán gestionar la concurrencia de nuestros propios programas si así lo deseamos o necesitamos. Una manera sencilla de ver los procesos que se están ejecutando en nuestro sistema es mediante el comando ps. Como este comando suele variar ligeramente en sus parámetros en distintos sabores UNiX, recomiendo la consulta de la página del manual (por ejemplo, en GNU/LiNUX, el comando ps –A lista todos los procesos del sistema. En *BSD, la orden es ps -a y aún así esto no garantiza que se muestren todos los procesos, dado que el sistema debe de estar configurado para ello. Sea como fuere, una salida clásica en GNU/LiNUX suele ser: Más adelante veremos y explicaremos en mayor luis@leonov:~$ ps -A profundidad la información asociada a este PID TTY TIME CMD gráfico. Sólo quiero llamar la atención sobre 1 ? 00:00:05 init lo que ocurre en el paso 2. Cuando hacemos 2 ? 00:00:00 keventd una llamada al sistema, pasaremos a modo 0 ? 00:00:00 ksoftirqd_CPU0 supervisor para poder realizar operaciones 0 ? 00:00:00 kswapd sobre el núcleo en modo supervisor. Este será 0 ? 00:00:00 bdflush el principal hueco que aprovecharemos a la 0 ? 00:00:00 kupdated hora de comprometer la seguridad de un 10 ? 00:00:00 khubd sistema, obteniendo permisos bajo ciertas 11 ? 00:00:11 kjournald condiciones que a priori no tiene un usuario 121 ? 00:00:00 kjournald "normal". 122 ? 00:00:00 kjournald Página 18 PC PASO A PASO Nº 16
  • 19. Programación bajo Linux - IPC - Programación bajo Linux - IPC - Programación bajo Linux - IPC 123 ? 00:00:00 kjournald del proceso. Este número es único para cada 176 ? 00:00:00 eth0 proceso y actúa de DNI de cada uno. De esta 196 ? 00:00:00 dhclient manera el sistema podrá manejar los procesos 200 ? 00:00:00 eth1 utilizando su DNI. 213 ? 00:00:00 portmap PPID 503 ? 00:00:05 syslogd 506 ? 00:00:00 klogd ( Parent Process Identification ) Identificador .......... del proceso padre. En un sistema UNiX los procesos son creados siempre por otros Para obtener aún más información sobre estos procesos, procesos. Esto hace que siempre exista una añadimos el parámetro -f: relación padre-hijo entre ellos y que obtengamos una estructura arbórea de dependencias entre luis@leonov:~$ ps -Af // En *BSD ps -al procesos. UID PID PPID C STIME TTY TIME CMD Existe un programa llamado pstree que root 1 0 0 16:42 ? 00:00:05 init [2] muestra esta estructura arbórea de dependencias padre-hijo. Suele estar root 2 1 0 16:42 ? 00:00:00 [keventd] disponible en todos los UNiX, pero no se suele instalar por defecto. Hasta donde root 0 1 0 16:42 ? 00:00:00 [ksoftirqd_CPU0] se, en Debian se puede instalar mediante apt-get install pstree y en *BSD se root 0 1 0 16:42 ? 00:00:00 [kswapd] dispone de un port en root 0 1 0 16:42 ? 00:00:00 [bdflush] /usr/ports/sysutils/pstree/. Sea como fuere, lo podemos descargar de root 0 1 0 16:42 ? 00:00:00 [kupdated] ftp://ftp.thp.Uni-Duisburg.DE/pub/source/ root 10 1 0 16:42 ? 00:00:00 [khubd] He dicho siempre. ¿Seguro? Siempre existirá un único proceso padre de todos los demás. a root 11 1 0 16:42 ? 00:00:11 [kjournald] la vista del comando ps y pstree, podemos root 121 1 0 16:43 ? 00:00:00 [kjournald] decir que este proceso "Adán" es init. root 122 1 0 16:43 ? 00:00:00 [kjournald] El resto de los campos de información los ignoraremos por ahora. Con lo visto, debe de root 123 1 0 16:43 ? 00:00:00 [kjournald] quedar claro que la información más importante asociada a un proceso será su PID y su PPID. root 176 1 0 16:43 ? 00:00:00 [eth0] Estos número que como hemos dicho identifican respectivamente al proceso, y al proceso padre ...... del mismo, son números de 16 bits que serán La información relevante mostrada será: asignados secuencialmente por el núcleo cuando se crea un proceso. UID Cuando programamos, el tipo asociado a un ( User Identification ) Nos muestra qué usuario lanzó ese PID suele ser un entero ( int ). Dado que proceso. siempre debemos de programar de manera que PID nuestro código sea lo más portable posible, se suele emplear el tipo pid_t proporcionado por ( Process Identification ) Nos muestra el número identificador <sys/types.h>. PC PASO A PASO Nº 16 Página 19
  • 20. Programación bajo Linux - IPC - Programación bajo Linux - IPC - Programación bajo Linux - IPC Veamos como podemos hacer que nuestros programas Los datos pueden variar un poco, pero lo conozcan su PID y su PPID: importante es observar que el PID y el PPID coinciden. /////////////////////////////////////////////////////////////////////////////////////////////////////// Ya sabemos qué es un proceso y sabemos cómo // se identifica. A continuación vamos a pasar al // ARCHIVO: pid.c lado siniestro de los entornos UNiX-like: El // comando kill. Este comando sirve para matar // DESCRIPCIÓN: cualquier proceso que haya creado nuestro // Este archivo muestra como obtener el PID y el PPID de usuario ( el usuario root puede matar cualquier // un programa. proceso del sistema ). Este comando funciona // enviando la señal SIGTERM a nuestro proceso, // COMPILACIÓN: haciendo que este muera de asesinato alevoso. // gcc -o pid pid.c // Sobre señales hablaremos más adelante, pero ////////////////////////////////////////////////////////////////////////////////////////////////////// anticipemos que es el medio de comunicación más básico que existe entre procesos. Todos #include <stdio.h> los procesos entienden un "lenguaje" especial #include <unistd.h> llamado señales. Mediante estas señales que #include <sys/types.h> son órdenes de este lenguaje, podremos dar ciertas órdenes a los procesos. Así que int main() estrictamente no estamos asesinando un { proceso: Le estamos invitando cortésmente a que se suicide. pid_t mi_pid, pid_papa; mi_pid = getpid(); pid_papa = getppid(); Vamos a ver esto con un ejemplo: printf("n Mi PID es %d y el de mi padre %dn", mi_pid, pid_papa); //////////////////////////////////////////////////////////////// } // Un experimento interesante será el añadir al final del programa // ARCHIVO: pesado.c mostrado una instrucción como sleep(10);. Esta instrucción // hace que tras ejecutar nuestro programa, este espere 10m // DESCRIPCIN: segundos para terminar. Si en un terminal ejecutamos este // Este archivo nos hará perder la paciencia programa, y en otro ejecutamos ps con los parámetros adecuados, podremos ver algo similar a: // // COMPILACIN: luis@leonov:~/hxc/articulo9_el_chaman/codigo$ ./pid2 // gcc -o pesado pesado.c Mi PID es 24560 y el de mi padre 24490 // Y en la otra ventana: //////////////////////////////////////////////////////////////// luis@leonov:~/hxc/articulo9_el_chaman$ ps -Al #include <stdio.h> F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD #include <unistd.h> ............ 0 S 1004 24560 24490 0 69 0 - 334 126840 pts/3 00:00:00 pid2 #include <sys/types.h> ............ Página 20 PC PASO A PASO Nº 16
  • 21. Programación bajo Linux - IPC - Programación bajo Linux - IPC - Programación bajo Linux - IPC int main() En ocasiones, los procesos se aferran a la vida. { Son así, qué le vamos a hacer. Entonces while(1) conviene invocar al comando kill con el parámetro -9, lo que provocará la ejecución { de un kill que no podrá ser ignorado. Es buena printf(" a %d dice: Desisme, ¿qué le pasó al mamut?n", (pid_t)getpid()); costumbre utilizar siempre este parámetro. sleep(1); Como curiosidad, decir que la salida ahora será: } ........ } 27972 dice: Desisme, ¿qué le pasó al mamut? Este programa es exactamente lo que parece: 27972 dice: Desisme, ¿qué le pasó al mamut? Un bucle infinito. Este programa repite mientras Terminado (killed) cierto, un absurdo mensaje acompañado por Lo que quiere decir que, esta vez sí, ha sido un pitido en el altavoz (secuencia de escape un asesinato y no un suicidio. a). Para el que no crea que este programa Tras leer tanto humor (malo) negro, puede no es digno merecedor de su nombre, parecer que esto de suicidarse y matar es un ejecutadlo durante diez minutos. Si pasado un recurso para hacer entretenido el artículo. Nada tiempo no os ha dado un ataque de tics o unas más lejos de la realidad: No es lo mismo que “ligeras” ganas de dejar mudo al ordenador un proceso se mate a él mismo aunque sea para siempre, entonces es que tenéis mucha por orden de otros, a que otros lo maten. Es paciencia. una sutil diferencia que nos debe de hacer Una posible salida de este programa será: sospechar que aunque el efecto sea el mismo, lo que ha ocurrido por debajo no lo es tanto. luis@leonov:~/hxc/articulo9_el_chaman/codigo$ ./pesado Ya lo veremos más adelante. 27972 dice: Desisme, ¿qué le pasó al mamut? En varias ocasiones he visto preguntar 27972 dice: Desisme, ¿qué le pasó al mamut? a la gente si no hay alguna manera para 27972 dice: Desisme, ¿qué le pasó al mamut? matar los procesos por el nombre del programa en vez de por el PID. A priori, ........ con los comandos vistos hasta ahora, El número que aparecerá a la izquierda ( en no. Pero existe un comando llamado skill el ejemplo el 27972 ), es el PID del programa. que sí puede hacer esto. Este comando tampoco se suele instalar por defecto Ahora, desde otro terminal, ejecutemos pero está disponible en todas las distribuciones que conozco. Si por alguna luis@leonov:~/hxc/articulo9_el_chaman/codigo$ kill 27972 razón no lo estuviese, podemos bajarnos En el terminal que nos estaba molestando l a s f u e n t e s d e aparecerá: ftp://fast.cs.utah.edu/pub/skill/. ........ Claro que siempre podemos hacernos nuestra 27972 dice: Desisme, ¿qué le pasó al mamut? propia versión de skill.... Esto no es una 27972 dice: Desisme, ¿qué le pasó al mamut? machada, y es un ejercicio muy interesante. Terminado Para ello disponemos del directorio /proc donde está la información disponible que nos muestra Descanse en paz. el comando ps ( ¿Recordáis lo que decíamos PC PASO A PASO Nº 16 Página 21
  • 22. Programación bajo Linux - IPC - Programación bajo Linux - IPC - Programación bajo Linux - IPC en los primeros capítulos de que en UNiX TODO 2.1.2. Creación de procesos es un archivo? Vamos a verlo. ). A la hora de generar nuestros propios procesos, Ejecutemos en un terminal de nuevo el tendremos varias posibilidades: programa pesado. Ahora tendrá otro PID: system luis@leonov:~/hxc/articulo9_el_chaman/codigo$ ./pesado La primera manera de crear nuevos procesos 28444 dice: Desisme, ¿qué le pasó al mamut? es invocar a la función system perteneciente a ........ la librería estándar de C. Con esta función podremos invocar cualquier comando o programa Ahora nos vamos al directorio /proc/28444/, del sistema que se encuentre en el path. Esta que es el lugar donde encontraremos toda la función, en caso de error, retorna -1. Si no información relativa al proceso 28444. Si puede ejecutar el programa por falta de curioseamos un poco por los archivos que nos permisos, devuelve 127. Un ejemplo: encontramos, veremos que se nos da información sobre los dispositivos montados, //////////////////////////////////////////////////////////////// la carga de CPU, etc... Es decir, toda la // información que le puede resultar de interés // ARCHIVO: system.c a un proceso. Vemos, además, que existe un // archivo llamado cmdline, que contiene el // DESCRIPCIóN: nombre del programa correspondiente a dicho // Ejemplo de uso de system proceso. Juntando esta información, veremos // que es relativamente sencillo hacer un programa que obtenga el PID (nombre del directorio) // COMPILACIÓN: de un determinado programa (lo que se // gcc -o system system.c encuentre en el archivo cmdline) de dicho // directorio. Sería una tarea de ir recorriendo //////////////////////////////////////////////////////////////// todos los directorios, almacenar temporalmente el nombre (número) de directorio y ver si lo #include <stdio.h> contenido en el archivo cmdline de dicho int main() directorio coincide con lo que buscábamos. Si { es así ya tenemos el número de proceso y lo int retorno; podremos matar. Si no, podemos seguir retorno = system("ls -l"); buscando. return retorno; El código de skill podría ayudarnos a realizar } esta tarea, pero si lo echamos un vistazo tal vez nos asuste un poco y no podamos identificar exec de un primer vistazo estas tareas. Aún así es La familia de funciones exec (llamada así porque una tarea que recomiendo, sobre todo cuando no existe una única función exec) nos permitirá veamos las señales. ejecutar otros programas desde nuestro propio Pero antes de ver señales, para poder trabajar código. Cuando realizamos una llamada exec, más a gusto con ellas, vamos a ver como nuestro programa para su ejecución y comienza podemos crear nuevos procesos desde nuestros la ejecución del programa que llamamos propios programas. Bienvenidos al apasionante mediante exec. El programa original deja de mundo de la clonación. ser accesible, no pudiendo retornar a él. Página 22 PC PASO A PASO Nº 16
  • 23. Programación bajo Linux - IPC - Programación bajo Linux - IPC - Programación bajo Linux - IPC La familia de funciones exec puede ser clasificada como: 4.- Funciones que contienen la letra e (execve y execle, ambaas vistas). 1.- Funciones que contienen la letra p en sus nombres (execvp y execlp). Sus declaraciones son: Este tipo de funciones poseen un argumento • int execvp(char *file, char *argv[]); adicional, char *envp[] que contiene las variables de entorno a pasar al programa a • int execlp(char *file, char *arg0, char *arg1, ..., char*argN, (char *) NULL); ejecutar. Este tipo de funciones busca el programa a ejecutar pasado Tanta variedad principalmente es debida a cómo a *file en el path. Como veremos ahora, las funciones que pasamos los argumentos al programa. Y esto no llevan la letra p en el nombre, requieren que se de la es importante porque nuestros programas ruta (path) absoluta al programa a ejecutar. también pueden recibir parámetros de la línea de comandos. Como esto en el cursillo de C *arg0, *arg1, ...., *argN son punteros a cadenas de texto básico se obvió, vamos a explicarlo brevemente que formarán los argumentos a pasar al programa. Se suele con unos ejemplos. apuntar *arg0 al nombre del propio programa (donde apunta *file), y se requiere que el último puntero apunte a NULL. En ocasiones nos interesará pasar a nuestros programas diversos argumentos. Por ejemplo: *argv[] será otra forma de representar los argumentos pasados al programa. Es un vector de cadenas de texto que $ codifica archivo.txt contiene los parámetros. Por convenio, argv[0] apunta siempre al nombre del propio programa y argv[N] a NULL archivo.txt es un argumento de nuestro programa codifica. Puede ser el nombre de 2.- Funciones que contienen la letra v en sus nombres (La ya vista execvp más execv y execve. Sus declaraciones cualquier archivo. La manera de que "veamos" son: desde dentro del código, el nombre de cualquier archivo, es consultando la lista de argumentos. • int execv(char *path, char *argv[]); Esta está disponible en argv[] que es un vector • int execve(char *path, char *argv[], char *envp[]); de cadenas de texto que contendrá tantas Estas funciones se caracterizan porque los argumentos del cadenas como argumentos se pasen. Veamos programa se pasan mediante *argv[] arriba explicado. un código que nos muestra sus argumentos: En cuanto al nuevo parámetro que aparece, *envp[], representa una lista de variables de entorno que podemos //////////////////////////////////////////////////////////////// pasar al nuevo programa. Estas variables de entorno se // pasan como cadenas de texto con el formato // ARCHIVO: args.c VARIABLE=valor. env[N] debe valer NULL. // 3.- Funciones que contienen la letra l (execl, execle y la // DESCRIPCIÓN: ya vista execlp. Su declaración es: // Este programa nos muestra el paso de argumentos • int execl (char *path, char *arg0, char *arg1, ..., char // por línea de comandos *argN, (char *)NULL); // • int execle(char *path, char *arg0, char *arg1, ..., // COMPILACIÓN: char *argN, (char *)NULL, *envp[]); // gcc -o args args.c Este tipo de funciones pasa los argumentos del programa uno a uno, a diferencia del caso anterior que se han de // meter previamente en una lista de argumentos. //////////////////////////////////////////////////////////////// PC PASO A PASO Nº 16 Página 23