Entrada/Salida sin Buffers

Una fuente de problemas cuando se usan pipes entre procesos es el hecho de que la mayor parte de las funciones de entrada/salida usan buffers intermedios. Para lograr que el mensaje llegue al proceso y no se estanque en buffers intermedios es necesario activar el modo autoflush.

Método Antiguo: La variable $|

El modo autoflush es controlado mediante la variable $|. La variable sólo afecta al fichero de salida estándar actualmente seleccionado. Por tanto, para poner un fichero en modo autoflush se hace primero un select, se pone la variable $| a 1 y se vuelve a hacer un select del fichero anterior. La función select retorna el fichero actualmente seleccionado. Por ejemplo, para poner en modo autoflush el fichero F hacemos:

my $previousF = select(F); $| = 1; select($previousF);

Que normalmente se resume en la siguiente frase hecha (idiom):

select((select F, $| = 1)[0]);

Método Recomendado: El módulo IO::Handle

El método autoflush de un objeto IO::Handle permite cambiar su estado de flush:

use IO::Handle;

$F = new IO::Handle;
$F->autoflush(1);

Las Funciones sysread y syswrite

Las funciones sysread y syswrite posibilitan la entrada/salida sin el uso de buffers intermedios. Por ello su uso - cuando de procesos se trata - es mas conveniente que el de las correspondientes funciones de e/s con buffers.

El formato de sysread es:

      sysread FILEHANDLE,SCALAR,LENGTH,OFFSET
      sysread FILEHANDLE,SCALAR,LENGTH

Se intenta una lectura del fichero FILEHANDLE de LENGTH bytes para escribirlos en el buffer SCALAR. No es buena idea mezclar la función con sus colegas con buffer: print, write, seek, tell y eof. Retorna el número de bytes que se pudieron leer.

El buffer SCALAR crece o se contrae para contener exactamente hasta el último byte leído. Si se especifica, el OFFSET dice en que lugar de SCALAR se colocan los datos leídos. Para saber que hemos llegado al final de la lectura compruebe que el número de bytes leídos es cero.

El formato de syswrite es:

     syswrite FILEHANDLE,SCALAR,LENGTH,OFFSET
     syswrite FILEHANDLE,SCALAR,LENGTH
     syswrite FILEHANDLE,SCALAR

Intenta escribir LENGTH bytes de SCALAR en FILEHANDLE saltándose los buffers de E/S. Si no se especifica LENGTH se escribe todo SCALAR.



Subsecciones
Casiano Rodríguez León
2010-03-22
@ISA = qw(Exporter)?.

  • ¿Que hace la línea our @EXPORT = qw( compile compile_from_file)?
  • ¿Que diferencia hay entre EXPORT Y EXPORT_OK?.
  • ¿En que lugar se dejan los ejecutables asociados con una distribución? ¿Cómo se informa a Perl que se trata de ejecutables?

  • ¿Que subrutina es llamada siempre que una subrutina no existe? ¿Donde queda el nombre de la subrutina llamada?

  • ¿Cómo puedo saber donde está instalado un módulo?

  • ¿Que ocurre cuando un código esta rodeado de un BEGIN?
  • ¿Cómo puedo saber donde está instalado un módulo?
  • cpan

    1. ¿Que hace el comando o conf de cpan?
    2. ¿Como se modifica la lista de mirrors para descarga?
    3. ¿Cuál es el significado de la opción makepl_arg?
    4. ¿Que hacen los comandos h, a, d, i, r, !, de cpan?

    5. ¿Que hacen los comandos upgrade, ls, look de cpan?

    Pruebas

    1. Describa las siguientes funciones use_ok , diag , ok , is , isnt , like , unlike , can_ok , isa_ok e is_deeply

    2. ¿Como se le indica a Test::More el número de pruebas a realizar? ¿Cómo se le indica a Test::More que no conocemos el número de pruebas a realizar?

    3. Supongamos que queremos hacer pruebas con módulos como Test::Exception, Test::Pod, etc. que no forman parte de la distribución núcleo de Perl. ¿Como deben ser diseñadas dichas pruebas de cara a no entorpecer la correcta distribución de su módulo?

    4. ¿Cómo se llama el módulo que permite hacer un estudio del cubrimiento de las pruebas?

    5. ¿Que es cubrir un if?

    6. ¿Cual es el número mínimo de ejecuciones necesarias de la siguiente condición para cubrirla completamente?

      $N > 0 and $R > 0 and $N == int $N and $R == int $R
      

    7. ¿Como ejecuto los tests de mi distribución?
    8. ¿Donde residen los tests de mi distribución?
    9. ¿Que extensión deben tener los programas de prueba?
    10. ¿Cuáles son los parámetros de la función ok?
    11. ¿Cuáles son los parámetros de la función is?
    12. ¿Porqué es conveniente nombrar las pruebas con un nombre que empiece por un número?
    13. ¿Como puedo ejecutar los tests en modo verbose?
    14. ¿Porque decimos que el diseño de la interfaz debe preceder a la implementación de las pruebas?
    15. ¿Como puedo probar un código que produce la detención del programa?
    16. ¿Que contiene la variable $@?
    17. ¿Que hace la función like?
    18. ¿Porqué la función use_ok es llamada dentro de un BEGIN?
    19. ¿Que es una prueba SKIP?
    20. ¿Que es una prueba TODO?
    21. Durante el desarrollo detecta un fallo en su código. Una vez resuelto el problema ¿Cómo debe afectar la detección del fallo a la fase de pruebas?
    22. ¿Que hace la función pod_file_ok? ¿A que módulo pertenece?
    23. ¿Que hace la llamada use Test::More qw(no_plan);?
    24. ¿Que hace la función can_ok? ¿Qué argumentos tiene?
    25. ¿Que diferencia hay entre is_deeply e is?

    26. ¿Que argumentos recibe la función throws_ok? ¿En que módulo se encuentra?

    27. ¿Que hace el comando HARNESS_PERL_SWITCHES=-MDevel::Cover make test?

    28. ¿Cómo se interpreta el cubrimiento de las subrutinas?
    29. ¿Cómo se interpreta el cubrimiento de las ramas? ¿y las condiciones lógicas?
    30. ¿En cual de estos factores es realista y deseable lograr un cubrimiento del %100 con nuestras pruebas?

    31. ¿Que hace la función lives_ok? ¿En que módulo está?

    Subversion

    1. ¿Cual es la orden para crear un repositorio subversion?

    2. ¿Cual es la orden subversion para crear un proyecto en un cierto repositorio?

    3. ¿Cual es la orden subversion para crear una copia de trabajo de un proyecto?

    4. ¿Cual es la función de los directorios trunk, branches y tags?

    5. ¿Que hace, svn commit? ¿Que hace svn update? ¿Que hace svn log?

    6. ¿Que hace svn -vu satus? ¿Que significan las opciones usadas?
    7. ¿Que es Request Tracker?
    8. Que significa -p1 en

      $ patch -p1 < ../newknap.patch
      

    9. ¿Que hace el comando svn update?
    10. ¿Que hace el comando svn commit -m 'changed this and that'?
    11. Suponga que se ha editado dos copias del mismo fichero en dos copias de trabajo. Actualicemos la segunda copia en el repositorio. ¿Que se observa?

    12. ¿Que hace gvim -d file1 file2?
    13. ¿Que hace diffupdate?
    14. ¿Que hace ]c?
    15. ¿Que hace [c?
    16. ¿Que hace 8]c?
    17. ¿Que hace do?
    18. ¿Que hace dp?
    19. ¿Que hace :diffg?
    20. ¿Que hace :12,20diffg?
    21. ¿Que hace el comando :buffers?
    22. ¿Que hace el comando :buffer 2?
    23. ¿Que hace :diffg 3?
    24. ¿Que hace :diffg batch.mine?
    25. ¿Que hace :diffput?
    26. ¿Que hace :12,20diffput?
    27. ¿Que hace zo?
    28. ¿Que hace zO?
    29. ¿Que hace zc?
    30. ¿Que hace zO?
    31. ¿Que hace :vnew?
    32. ¿Que hace CTRL-W v?
    33. ¿Que hace :set foldmethod=manual?
    34. ¿Que hace zf}?
    35. ¿Que hace :diffthis?
    36. ¿Que hace :diffsplit filename?
    37. ¿Que hace :windo ?
    38. Explique la siguiente secuencia de comandos vim:
      :1,5yank a
      :6,10yank  b
      :tabedit | put a | vnew | put b 
      :windo diffthis
      
    39. ¿Cómo se resuelve un conflicto usando vimdiff?

    40. ¿Que hace el comando patch? ¿Cómo se crea un patch?
    41. ¿Que hace :diffpatch filename?
    42. ¿Que hace :vert diffpatch filename?
    43. ¿que hace esta secuencia de comandos?
      $ svn diff modulos.tex -r PREV:HEAD > patch
      $ vi 
                :.!svn cat modulos.tex -r PREV
                :vert diffpatch patch
      

    ssh

    1. ¿Como se genera una pareja clave privada-pública?

    2. ¿Como se "publica" una clave?

    3. ¿Cual es el formato de una línea del fichero ~/.ssh/authorized_keys ¿Cómo se pinene comentarios en dicho fichero? ¿que ocurre con las líneas en blanco?

    4. ¿Que hace esta opción?

        from="!enemy.my_isp.net,*.my_isp.net,home.example.com"
      

    5. ¿Cómo se restringe el comando que se puede ejecutar para una determinada clave?

    6. ¿Que hace el programa svnserve?

    7. ¿Como podemos hacer que nuestro repositorio sea accesible por otros usuarios mediante el protocolo svn+ssh si no tenemos privilegios de administrador?

    8. ¿Que hace la opción --tunnel-user=user de svnserve?

    9. ¿En que fichero se pone esta línea?
      command="/usr/bin/svnserve -t -r /home/casiano/repository --tunnel-user=lgforte",no-port-forwarding  ssh-dss ....
      

    Procesos

    1. ¿Que diferencia hay entre ejecutar system con uno o con varios argumentos?
    2. ¿Que diferencia hay entre ejecutar system con o sin redirección, pipes, background, etc.?
    3. ¿Que diferencia hay entre ejecutar system y exec?
    4. En Perlmonks apareció la siguiente pregunta (puede encontrarla buscando en http://www.perlmonks.org/ por 'Environmental Settings'.
      I require some assistance. I am writing a CGI script in Perl on Solaris
      that needs to run external commands using the 'system' operator. These
      commands are part of a larger package that needs the system initialized
      (via a command) properly before execution, or else each individual
      command cannot interact with the other, like the following.
      
      1: system "/PATH/initialize_system"; # init the environment
      2: system "/PATH/skew.k ARG_FOR_FRAME_NUMBER"; # create image
      3: system "/PATH/savegif.k FRAME_NUMBER"; # save image off
      4: system "exit"; # exit the environment created with initialize_system
      
      When running a command using 'system', the environment appears to only
      lasts until the next line of Perl code, so line 2 can't talk to line
      3 because the environment required for them to communicate isn't there
      which is initialized by line 1. The above code snippet would the way it
      is run from a command line. 
      
      Any help would be appreciated. 
      Thanks.
      

      ¿Cuál es su respuesta?

    5. Ejecute los comandos:
      $ set | grep "^[A-Z]" |wc
      $ perl -e 'print "$_ = $ENV{$_}\n" for sort keys %ENV;' | wc
      
      ¿A que se debe la diferencia?. Consulte el módulo Env::Bash . Discuta su funcionalidad.

    6. Que diferencia hay entre
      system 'echo $PATH'
      
      y
      system "echo $PATH"
      
    7. Que salida se obtiene al ejecutar:
      system('echo','hola','>','juan.txt');
      
    8. ¿Que valor devuelve system?

    9. ¿Que hace la asignación *a = *b?
    10. ¿Que hace la asignación *a = \$b?
    11. ¿Que hace la asignación *a = \&Paquete::Con::Un::Largo::Nombre::resuelve?
    12. ¿Que hace la asignación *a = \*STDOUT?
    13. Cual es la salida en la siguiente sesión:
        DB<1> *a = \*STDOUT
        DB<2> print a "hola"
      

    14. ¿Que contiene el hash %ENV?
    15. ¿Que relación hay entre interpolación y backticks?
    16. ¿Que ocurre si los backticks se ejecutan en un contexto de lista?
    17. ¿Que hace el operador qx?
    18. ¿Que hace el comando tee?
    19. ¿Que error se produjo si $? == -1?
    20. ¿Que error se produjo si $? & 127?
    21. ¿Que contiene $? & 128?
    22. ¿Que contiene la expresión $? >> 8?
    23. Ejecute la siguiente sesión en el depurador (el programa bc implementa una calculadora). Explique la secuencia de eventos:
      pp2@nereida:~/alu$ perl -wde 0
      main::(-e:1):   0
        DB<1> open $F, "|bc"
        DB<2> print $F "4*3\n"
        DB<3> print $F "5*2\n"
        DB<4> close($F)
      12
      10
        DB<5>
      

    24. Ejecute la siguiente sesión en el depurador. Explique la secuencia de eventos:
        DB<6> $F->autoflush(1)
        DB<7> open $F, "|bc"
        DB<8> print $F "4*3\n"
      12
        DB<9> print $F "5*2\n"
      10
      

    25. Abra un pipe con bc y alimente la calculadora usando syswrite. ¿Que diferencias observa?

    26. ¿Que ocurre en un contexto de lista en una ejecución con backticks si se ha redefinido $/?

    27. Explique la diferencia de conducta entre estos dos ejemplos

    28. ¿Cómo puedo hacer que en un segmento de mi programa Perl todas las salidas a STDOUT sean redirigidas a un determinado fichero?

    29. ¿Que contiene el hash %SIG?

    30. ¿Como puedo hacer que un programa no se detenga debido a una señal PIPE? ¿Cuándo se genera una señal PIPE?

    Mas sobre Subversion



    Subsecciones
    Casiano Rodríguez León
    2010-04-26