Herramientas de usuario

Herramientas del sitio


notas:programacion

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
notas:programacion [2011/06/10 12:40] cayunotas:programacion [2014/02/07 18:02] (actual) – [IOCTLs] cayu
Línea 1: Línea 1:
 ===== Programación ===== ===== Programación =====
 +===== SCRIPTS =====
 +
 +[[notas:programacion:Introducción a AWK]]
  
 ===== IOCTLs ===== ===== IOCTLs =====
Línea 9: Línea 12:
 [[notas:programacion:The Linux CDROM interface]] [[notas:programacion:The Linux CDROM interface]]
  
 +[[notas:programacion:Sockets en Linux]]
 ===== Notas generales de programación ====== ===== Notas generales de programación ======
  
Línea 90: Línea 94:
 <code> <code>
  running  running
 +</code>
 +
 +
 +=== Agregar comillas a direcciones IP en archivo CSV ===
 +
 +Por ejemplos nos dieron un archivo CSV con todos los campos delimitados por comas, menos las direcciones IP
 +
 +<code>
 +"10.1.1.5","255.255.255.0","Equipo de Red","Red de casa","","DHCP","","","","",""
 +</code>
 +
 +<code bash>
 +sed 's/[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}/"&"/g'
 </code> </code>
  
Línea 119: Línea 136:
 <code bash> <code bash>
 echo "tmp=$variable; tmp /= 1;tmp" | bc echo "tmp=$variable; tmp /= 1;tmp" | bc
 +</code>
 +
 +=== Pasar mayúculas y minúsculas ===
 +
 +<code>
 +echo hola | tr '[:lower:]' '[:upper:]'
 +echo HOLA | tr '[:upper:]' '[:lower:]'
 </code> </code>
  
Línea 136: Línea 160:
 </code> </code>
  
 +=== can you get cp to give a progress bar like wget ===
 +
 +http://chris-lamb.co.uk/2008/01/24/can-you-get-cp-to-give-a-progress-bar-like-wget/
 +
 +<code bash>
 +#!/bin/sh
 +cp_p()
 +{
 +   strace -q -ewrite cp -- "${1}" "${2}" 2>&1 \
 +      | awk '{
 +        count += $NF
 +            if (count % 10 == 0) {
 +               percent = count / total_size * 100
 +               printf "%3d%% [", percent
 +               for (i=0;i<=percent;i++)
 +                  printf "="
 +               printf ">"
 +               for (i=percent;i<100;i++)
 +                  printf " "
 +               printf "]\r"
 +            }
 +         }
 +         END { print "" }' total_size=$(stat -c '%s' "${1}") count=0
 +}
 +</code>
 +
 +
 +=== Sockets en PHP ===
 +
 +**servidor-tcp.php**
 +<code php>
 +<?php
 +$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);
 +if (!$socket) {
 +  echo "$errstr ($errno)<br />\n";
 +} else {
 +  while ($con = stream_socket_accept($socket)) {
 +    fwrite($con, 'La hora local es ' . date('n/j/Y g:i a') . "\n");
 +    fclose($con);
 +  }
 +  fclose($socket);
 +}
 +?>
 +</code>
 +
 +
 +**servidor-udp.php**
 +<code php>
 +<?php
 +$socket = stream_socket_server("udp://127.0.0.1:1113", $errno, $errstr, STREAM_SERVER_BIND);
 +if (!$socket) {
 +    die("$errstr ($errno)");
 +}
 +
 +do {
 +    $pqt = stream_socket_recvfrom($socket, 1, 0, $peer);
 +    echo "$peer\n";
 +    stream_socket_sendto($socket, date("D M j H:i:s Y\r\n"), 0,
 +    $peer);
 +} while ($pqt !== false);
 +
 +?>
 +</code>
 +
 +**ascii.c**
 +<code c>
 +#include <stdio.h>
 +
 +int main()
 +{
 +   int n;
 +   for (n=16; n<256;n+=4)
 +      printf ("%d.- %c  %d.- %c  %d.- %c  %d.- %c  %d.- %c  %d.- %c  %d.- %c\n", 
 +      n, n, n+1, n+1, n+2, n+2, n+3, n+3, n+4, n+4, n+5, n+5, n+6, n+6);
 +   return 1;
 +}
 +</code>
 +===== Problema clásicos de programación ======
 +
 +=== Peluquero dormilón ===
 +
 +<code c>
 +/*
 +Author: dhb@email.it
 +Your comments are welcome.
 +
 +Peluquero dormilón
 +Introducción
 +Una ciudad tiene una peluquería con dos puertas y unas pocas sillas.
 +Los clientes entran por una puerta y salen por la otra.
 +Dado que el negocio es chico, a lo sumo un cliente o el peluquero se pueden mover en al a la vez.
 +El peluquero pasa su vida atendiendo clientes, uno por vez.
 +Cuando no hay ninguno, el peluquero duerme en su silla.
 +Cuando llega un cliente y encuentra que el peluquero está durmiendo, el cliente lo despierta,
 +se sienta en la silla del peluquero y duerme mientras el peluquero le corta el pelo.
 +Si el peluquero está ocupado cuando llega un cliente, el cliente se va a dormir a una de las otras sillas.
 +Despúes de un corte de pelo, el peluquero abre la puerta de salida para el cliente y la cierra cuando el cliente se va.
 +Si hay clientes esperando, el peluquero despierta a uno y espera que el cliente se siente.
 +Sino, se vuelve a dormir hasta que llegue un cliente.
 +Implementación
 +La implementación propuesta esta desarrollada en C usando semáforos.
 +Semáforos: 
 +Clientes (customers): número de clientes en espera sin contar el que se esta cortando el pelo
 +Barberos (barber): número de peluqueros (barberos) inactivos.
 +Exmut: exclusión mutua.
 +Condiciones iniciales: customers = 0, barber = 0, exmut = 1
 +Código
 +*/
 +#include <stdio.h>
 +#include <unistd.h>
 +#include <pthread.h>
 + 
 +#define TRUE 1
 +#define FALSE 0
 +#define CHAIRS 3 //Sillas Disponibles
 +#define CANT_CUST 5 //Cantidad de Clientes
 +#define T_CUST 0 //Tiempo de llegada de Clientes
 +#define T_CORTE 3 //Tiempo de corte de pelo
 + 
 +typedef int semaphore;
 + 
 +//Prototipo de funciones
 +void *customer (void *);
 +void *barber (void *);
 +void up (semaphore *);
 +void down (semaphore *);
 + 
 +semaphore sem_barber=0, sem_customer=0,sem_mutex=1;
 +int waiting=0;
 + 
 +//Main function
 +int main (void) {
 + pthread_t barb_t,cust_t[CANT_CUST];
 + int i;
 + 
 + pthread_create(&barb_t,NULL,barber,NULL);
 + for (i=0;i<CANT_CUST;i++){
 +    sleep(T_CUST);
 +    pthread_create(&cust_t[i],NULL,customer,NULL);
 + }
 +    
 + pthread_join(barb_t,NULL);
 + return(0);
 +}
 + 
 +void *customer (void *n) {
 + printf ("Customer:entrando hay %d esperando\n",waiting);
 + down (&sem_mutex);
 + if (waiting < CHAIRS) {
 +  waiting++;
 +  up (&sem_customer);
 +  up (&sem_mutex);
 +  down (&sem_barber);
 +  printf ("Customer:Me estan cortando el pelo.\n");
 + }
 + else {
 +  up (&sem_mutex);
 +  printf ("Customer:Me fui no hay lugar.\n");
 + 
 +}
 + 
 +void *barber (void *j) {
 + printf ("Barber:Empiezo a trabajar\n"); 
 + while (TRUE) {
 +  down (&sem_customer);
 +  down (&sem_mutex);
 +  waiting--;
 +  up (&sem_barber);
 +  up (&sem_mutex);
 +  printf ("Barber:Comienzo el corte de pelo de un cliente quedan %d esperando.\n",waiting);
 +  sleep (T_CORTE);
 +  printf ("Barber:Termine de cortar el pelo de un cliente quedan %d esperando.\n",waiting);
 + }
 +}
 + 
 +void up (semaphore *sem) {
 + *sem+=1;
 +}
 + 
 +void down (semaphore *sem) {
 +  while (*sem<=0){};
 +  *sem-=1;
 +}
 +</code>
 +
 +=== Uso de la Función div() ===
 +
 +
 +**Sintaxis:**
 +
 +div_t div(int num, int denom);
 +
 +**Descripcion:** Calcula el cociente y resto de la división del numerador num entre el denominador denom. Si la división es inexacta, el cociente resultante es el entero de menor magnitud que es el más próximo al cociente algebraico. Si el resultado no puede ser representado, el comportamiento no está definido; de lo contrario, quot * denom + rem igualará num.
 +
 +
 +<code c>
 +#include <stdlib.h>
 +#include <stdio.h>
 + 
 +int main()
 +{
 +   div_t d;
 +   int num, denom;
 + 
 +   puts( "Escriba el numerador y el denominador (separados por un espacio):" );
 +   scanf( "%d %d", &num, &denom );
 +   d = div( num, denom );
 +   printf( "ldiv( %d, %d ) : cociente = %d, resto = %d\n", num, denom, d.quot, d.rem );
 + 
 +   return 0;
 +}
 +</code>
notas/programacion.1307709618.txt.gz · Última modificación: 2011/06/10 12:40 por cayu