lunes, 28 de febrero de 2011

Diagrama de Flujo del ejercicio #8 de estructuras secuenciales

8. Todos los lunes, miércoles y viernes, una persona corre la misma ruta y cronometra los tiempos obtenidos. Determinar el tiempo promedio que la persona tarda en recorrer la ruta en una semana cualquiera.


domingo, 27 de febrero de 2011

sábado, 26 de febrero de 2011

Diagrama de Flujo del ejercicio #4 de estructuras secuenciales

4. Calcular el número de pulsaciones que una persona debe tener por cada 10 segundos de ejercicios, si la fórmula es Num_pulsaciones=(220-edad)/10

Programa_para_contar_Caracteres

#include<stdio.h>
int cuentaLet(char*p);
int main (void){
    char P[100];
    printf("\n\t::Bienvenido al programa que cuenta el numero de carateres de una palabra::\n\a");
    printf("\n\t Por favor ingrese una palabra:  ");
    scanf("%s",&P);
}
int cuentaLet(char*p){
        char *p;
        char c;
        p=&char P[100];
         int a=1;              
        while(c!='\o'){
        c=*p++;
        }
    printf("%i", a);
    getch();
}


---------------------------------------------------------------------------------------------------------------
#include<stdio.h>
int cuentaLet(char*);
int main (){
    printf("\n\t::Bienvenido al programa que cuenta el numero de carateres de una palabra::\n\a");
    printf("\n\t Por favor ingrese una palabra:  ", cuentaLet);   
}
int cuentaLet(char*c){
    char *c=;
    char P[10];
    int a=1; 
        while(c!='\0'){
        c=P[a++];
        }
    printf("%c",P[a-1]);
}

jueves, 24 de febrero de 2011

Diagrama de Flujo del ejercicio #7 de estructuras secuenciales

7. El dueño de una tienda compra un artículo a un precio determinado. Obtener el precio en que lo debe vender para obtener una ganancia del 30%.

miércoles, 23 de febrero de 2011

Diagrama de Flujo del ejercicio #3 de estructuras secuenciales

3. La presión, el volumen y la temperatura de una masa de aire se relacionan con la fórmula:

masa= (presión*volumen)/(0.37*(temperatura+460))

martes, 22 de febrero de 2011

Diagrama de Flujo del ejercicio #6 de estructuras secuenciales

6. En un hospital existen tres áreas: Ginecología, Pedriatía, Traumatología. El presupuesto anual del hospital se reparte conforme a la siguiente tabla:

Área                                      Porcentaje del presupuesto

Ginecología                             40%
Pedriatía                                  30%
Traumatología                          30%

Diagrama de Flujo del ejercicio #9 de estructuras secuenciales

9. Tres personas deciden invertir su dinero para fundar una empresa. Cada una de ellas invierte una cantidad distinta.Obtener el porcentaje que cada quien invierte con respecto a la cantidad total invertida.

POR PARAMETROS POR VALOR Y PARAMETROS POR REFERENCIA

lunes, 21 de febrero de 2011

miércoles, 9 de febrero de 2011

TAREA 0.2


UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO.
FACULTAD DE CONTADURÍA Y ADMINISTRACIÓN.
CAMACHO BOLAÑOS ANGÉLICA MIRIAM. 2293.
INFOMÁTICA II (ESTRUCTURAS DE DATOS ESTÁTICAS Y DINÁMICAS EN MEMORIA PRINCIPAL).

Compilador GCC: Para compilar programas escritos en C, disponen de un compilador de nombre gcc. Este compilador toma como parámetros los ficheros fuentes de que consta el programa final y, tras una serie de pasos, produce un fichero ejecutable. Si durante la compilación se produce un error, no se genera el ejecutable. Los pasos de compilación en UNIX son al menos estos cuatro:
  • Preproceso (macros, inclusión de ficheros...).
  • Compilación a objeto
  • ensamblado
  • Enlace (linking) de objetos y bibliotecas
GCC es un compilador integrado del proyecto GNU para C, C++, Objective C y Fortran; es capaz de recibir un programa fuente en cualquiera de estos lenguajes y generar un programa ejecutable binario en el lenguaje de la máquina donde ha de correr. La sigla GCC significa "GNU Compiler Collection". Originalmente significaba "GNU C Compiler".La sintaxis para compilar un típico programa escrito en C es la siguiente:
Ejemplos: donde -Wall especifica que se mostraran todos los errores, warning o advertencias que acontecen en la compilación. Hola1.c y hola2.c son los nombres de los ficheros en C donde reside el código fuente, hola es el nombre del fichero ejecutable que se pretende generar, y -lgnome-2 -lbluetooth especifican las librerías con las que se van enlazar los ficheros (en este caso las librerías libgnome-2.so y libbluetooth.so).
Estructura: La interfaz exterior de GCC es generalmente estándar para un sistema UNIX. Los usuarios llaman un programa controlador llamado gcc, que interpreta los argumentos dados, decide que compilador usar para cada archivo y ejecuta el ensamblador con el código resultante, después posiblemente ejecuta el enlazador para producir un programa completo. Cada uno de los compiladores es un programa independiente que toma como entrada código fuente y produce código en ensamblador. Todos ellos tienen una estructura interna común: un front end por lenguaje que procesa el lenguaje y produce un árbol de sintaxis y un back end, que convierte esos árboles al lenguaje RTL (lenguaje de transferencia de registros) de GCC, luego realiza varias optimizaciones y produce el ensamblador utilizando un reconocimiento de patrones específico para la arquitectura, originalmente basado en un algoritmo de Jack Davidson y Chris Fraser. Casi todo GCC está escrito en C, aunque gran parte del front end de Ada está escrito en Ada. El 30 de mayo de 2010 se anunció que se comenzará a utilizar C++ en el desarrollo de GCC.[5]
Front ends: Los front ends varían internamente, teniendo que producir árboles que puedan ser manejados por el back end. Todos los analizadores son analizadores recursivos descendentes y fueron escritos manualmente, no generados automáticamente. Hasta hace poco, el árbol de representación de programa no era totalmente independiente del procesador para el que se quería generar el código. Recientemente se han incluido dos nuevas formas de árbol independientes del lenguaje. Estos nuevos formatos son llamados GENERIC y GIMPLE. El análisis ahora es realizado creando árboles temporales dependientes del lenguaje y convirtiéndolos a GENERIC. El gimplifier convierte esto a GIMPLE, que es el lenguaje común para un gran número de optimizaciones independientes de la arquitectura y del lenguaje.  La optimización en árboles no entra en lo que la mayoría de los desarrolladores de compiladores consideran trabajo del front end, ya que no es dependiente del lenguaje y no involucra el análisis. Los desarrolladores de GCC han dado a esta parte del compilador el nombre de middle end. Las optimizaciones incluyen eliminación de código que nunca se ejecuta, eliminación parcial de redundancia, redundancia a la hora de evaluar expresiones... Actualmente se está trabajando en optimizaciones basadas en dependencia de arreglos.

Back end: El comportamiento del backend está parcialmente especificado por el preprocesador de macros específicas a la arquitectura objetivo, por ejemplo para definir la posición de los bits más significativos, tamaño de palabra, convención para llamadas, etc. El backend utiliza éstas para la generación de RTL, aunque en GCC éste es independiente del procesador, la secuencia inicial de instrucciones abstractas es adaptada a la arquitectura objetivo.


HERRAMIENTAS BASICAS DE DESARROLLO: El lenguaje de programación más usado en el desarrollo de aplicaciones para entornos Unix es, sin duda C, seguido de cerca por C++. El proyecto GNU elaboró en su día un compilador multiplataforma que además es extensible a varios lenguajes. También se dispusieron una serie de herramientas adicionales que facilitan la labor del programador a la hora de afrontar cualquier proyecto. En este documento se explican algunas de las más comunes en todo desarrollo, y se verán ejemplos de utilización de las mismas.

1. INTRODUCCION

Cuando iniciamos el desarrollo de un programa, además del compilador para nuestro lenguaje, es imprescindible el uso de un depurador que nos permita encontrar y reparar errores de nuestro software de una manera productiva. GNU Compiler Collection es un compilador desarrollado por el proyecto GNU, capaz de generar código para diferentes plataformas hardware, y desde diversos lenguajes de programación  diferentes. También nos proporcionan un potente depurador que es capaz de interpretar el código de cada uno de estos lenguajes, de forma que sea sencillo hacer un seguimiento de la ejecución de nuestro programa. Además, puede sernos de mucha utilidad que ejecutemos nuestro software a través de un profiler, como puede ser gconf, ya que ´este nos proporcionara suficiente información para detectar cuellos de botella en nuestro programa, que serán susceptibles de optimizar. En aplicaciones grandes, es bastante habitual (y aconsejable) que el código que conforma nuestra aplicación se halle repartido en distintos módulos, los cuales deben ser compilados a código objeto uno a  uno, para después integrarlos formando la aplicación final. Las dependencias de estos módulos exigen además una compilación ordenada, y cualquier cambio en un modulo puede suponer la necesidad de recompilar muchos otros. Es conveniente automatizar este proceso, de forma que se realice transparentemente, y de ello se encarga la herramienta make. No hay que olvidar que, desde que la proliferación de los sistemas UNIX ha ido en aumento, han surgido diferentes implementaciones; antes de que se estableciese el estándar POSIX, esto dio lugar a un tremendo caos, que obligaba a los desarrolladores interesados en hacer su software multiplataforma a usar diversos artificios, que permitiesen la migración de su programa a otros sabores de UNIX. Aún cuando POSIX se dio a conocer, los diversos sistemas adoptaron dicho estándar en distintas fechas, y aún existen ligeras diferencias que serían una traba para nuestro propósito. Fueron necesarias, entonces, el uso de ciertas herramientas que facilitaran la adaptación de nuestro código a estas posibles diferencias, y además que dicha tarea fuese lo más automatizada posible, para que el futuro usuario pudiese compilar el paquete de software sin necesidad de realizar complicados pasos. Aunque existen muchos programas que cumplen estas especificaciones, son de destacar los elaborados desde el proyecto GNU: autoconf, automake y libtool. Debido a la limitación de tiempo y espacio para esta ponencia, se tratará únicamente la primera de ellas, que en muchos casos es suficiente. Todo este conjunto de herramientas hará que podamos centrarnos en el desarrollo en sí, que ´este sea de calidad y lo más exento posible de errores, y que no tengamos que preocuparnos de detalles de portabilidad, aumentando nuestra productividad.

2. GCC O GNU COMPILER COLLECTION

El compilador de GNU, si bien está formado por diversas partes, puede funcionar como un todo, permitiendo
la modificación de su comportamiento a través de diversos parámetros. Como ya se ha comentado, dispone de varios front-ends que generan código objeto desde distintos lenguajes. Si bien soporta también diferentes formatos de binarios, el más usado es el formato ELF.  GCC, al igual que la mayoría de los compiladores, divide su proceso en varias fases. Si no le indicamos nada especial, intentara pasar a lo largo de todas las fases, para generarnos el ejecutable final. Es posible, no obstante, indicar que se detenga tras una fase en concreto. He aquí una pequeña lista: Preprocesado Compilación Ensamblado Enlazado Algunos parámetros que controlan la compilación son los siguientes:
-E Sólo preprocesa
-S Sólo compila; no ensambla o enlaza
-c Compila y ensambla, pero no enlaza
-o Coloca la salida en fichero indicado
-ansi Usa el estándar ANSI C89 (en C)
-std=xxx xxx = Estándar a seguir (c89, c99...)

El parámetro -o nos permite establecer el nombre del fichero de salida. Si lo usamos sin ningún otro, obtendremos un ejecutable con el nombre indicado tras dicho parámetro. En otro caso, el nombre por defecto es a.out. Por otro lado, para el desarrollo en lenguaje C, el compilador GCC normalmente usa ciertas extensiones al lenguaje proporcionadas por GNU. Estas extensiones añaden características como un nuevo tipo de datos (long long, entero de 64 bits), rangos para los case, y otras. No obstante, como se ha visto, pueden utilizarse algunos estándares como ANSI C89 o C99 (este ´ultimo esta parcialmente soportado), deshabilitando de esta forma las extensiones. Para que el compilador emita los warnings debidos al incumplimiento de dichos estándares, ha de usarse además el parámetro -pedantic. También es posible usar -pedanticerror, para emitir errores en lugar de warnings. Para finalizar, hay que indicar a GCC el uso de las distintas bibliotecas de funciones, de forma que ´este pueda enlazar correctamente nuestra aplicación con las mismas. Las bibliotecas disponibles en nuestro sistema normalmente se sitúan en /lib, /usr/lib o /usr/local/lib. Cuando usemos una de estas bibliotecas, lo señalaremos usando el parámetro -l seguido del nombre de la biblioteca, eliminando el prefijo lib inicial. Por ejemplo, si nuestro programa hace uso de funciones de la biblioteca libgtk, indicaremos -lgtk. No hace falta incluir la biblioteca estándar de C (libc), salvo la parte correspondiente a las funciones matemáticas (libm). Si las bibliotecas estuviesen situadas en un lugar distinto a los habituales, puede avisarse de ello a GCC con el parámetro -L, seguido de la ruta a los ficheros de biblioteca. Los ficheros include con las cabeceras de estas bibliotecas también pueden hallarse en una ruta diferente a la habitual. Es posible indicar rutas alternativas mediante -I seguido de la ruta. Como el mejor profesor es un buen ejemplo, veamos uno que cubra la mayor parte de lo visto hasta ahora. Imaginemos que tenemos un programa compuesto por dos módulos: main.c (que contiene la función main de nuestro programa) y foobar.c (con funciones adicionales). Además, usamos una biblioteca llamada libglib que, casualmente, está situada en una ruta no habitual: /usr/lib/glib.  Queremos generar un ejecutable miprograma, con el código objeto necesario de cada modulo o biblioteca. El procedimiento a seguir ser´ıa el siguiente:
bash$ gcc -c foobar.c}
bash$ ls
foobar.c foobar.h foobar.o main.c
bash$ gcc -o miprograma foobar.o \
-L/usr/lib/glib -lglib
bash$ ls
foobar.c foobar.h foobar.o main.c
miprograma

Las opciones de compilación de GCC son muy diversas y variadas, y es conveniente estudiarlas en detalle. Normalmente hay un documento en línea disponible en la mayoría de las maquinas UNIX, que puede consultarse mediante el comando info gcc. Su lectura es altamente aconsejada.

3. LA HERRAMIENTA MAKE

Con make podemos definir las dependencias que existen entre nuestros módulos, así como el proceso a seguir
para obtener las distintas partes intermedias de la compilación. Esto permitiría que generemos el ejecutable de nuestro programa de un plumazo, recompilando si son necesarias aquellas partes que han sufrido cambios. La sintaxis de make es sencilla. Las reglas mencionadas se describen en un fichero de nombre makefile o Makefile. Se componen de un objetivo intermedio (o final), un conjunto de prerrequisitos (dependencias), y un grupo de comandos que, al ser ejecutados, generan el objetivo. El formato de escritura de estas reglas es el siguiente:
objetivo : prerrequisitos ...comando
Hay que destacar que la indotación establecida para cada uno de los comandos no es trivial. Todos los comandos deben ir precedidos de un tabulador.  Es importante que no se sustituya por un grupo de espacios, ya que entonces make no interpretaría correctamente nuestra regla. El tabulador es imprescindible. Veamos un ejemplo de fichero makefile, para nuestra situación hipotética mencionada anteriormente:
miprograma : main.o foobar.o
gcc -o miprograma main.o foobar.o \
-L/usr/lib/glib -lglib
main.o : main.c foobar.h
gcc -c main.c
foobar.o : foobar.c foobar.h
gcc -c foobar.c

Para compilar nuestro programa, nos bastaría con ejecutar make miprograma desde el directorio donde están situadas las fuentes y el fichero makefile. Por defecto, si no se indica el objetivo que se desea crear, make usará el primero de los objetivos definidos. Por tanto, si hubiésemos usado make, a secas, en este caso, obtendríamos el mismo resultado:

bash$ make
gcc -c main.c
gcc -c foobar.c
gcc -o miprograma main.o foobar.o
-L/usr/lib/glib –lglib

Como puede observarse, hemos declarado una regla para nuestro ejecutable miprograma así como para los códigos objeto intermedios de sus diferentes módulos. Además, como prerrequisitos, hemos establecido para cada módulo tanto su código fuente original como el de las cabeceras que incluye. De esta forma, si algo cambiase en las cabeceras, o en el código en C, el módulo debe recompilarse para que el código objeto refleje los cambios. Las diferentes partes de nuestra aplicación son generadas ordenadamente para cumplir con las exigencias de dependencias que necesita cada una.

 Es interesante conocer cómo sabe make cuando debe recompilar un módulo, de forma que entendamos mejor el proceso, y podamos controlarlo a voluntad. Al intentar obtener el objetivo, primero observa sus dependencias, y trata de resolverlas, considerándolas ahora su objetivo principal. Una vez resueltas las dependencias, se procederá a la creación del objetivo. Cuando se decide por un objetivo determinado, lo primero que hace es comprobar si ya existe (si ya está compilado). Si no lo está, entonces simplemente ejecuta los comandos indicados para ese objetivo. Si, en cambio, ya existe, entonces realiza una comprobación de fechas.

En caso de que el objetivo tenga una fecha y hora de modificación mayor que sus dependencias, entonces se presupone que el objetivo está actualizado; en cambio, si alguna de las dependencias posee una fecha mayor que el objetivo, ´este debe ser lógicamente actualizado. Los ficheros makefile pueden también contener ciertas reglas que no poseen dependencias, y que nos permiten automatizar algunas otras tareas. Por ejemplo, podríamos incluir una regla clean, de tal forma que al hacer make clean se eliminen del directorio de fuentes todo aquello que forma parte del proceso de compilación: ficheros objeto, programas ejecutables, etc. De esta forma, el directorio contendría de nuevo sólo los fuentes de nuestra aplicación. Para definir estas reglas sin prerrequisitos, lo correcto es indicar previamente que se trata de una regla de este tipo, mediante la palabra reservada .PHONY. Luego, se escribe la regla como anteriormente. Así:

.PHONY : clean
clean : rm -f *.o miprograma

También es posible definir variables, de forma que en alguna parte de la regla se usen ´estas en lugar del texto correspondiente. Así, eliminamos alguna parte reiterativa, o bien facilitamos la edición del fichero makefile para que pueda adaptarse a otros entornos. Por ejemplo, podríamos usar una variable CC cuyo contenido sea el nombre del ejecutable del compilador de C. Así, en todas las líneas donde se use el mismo, sustituiríamos gcc por $(CC). La variable estaría definida al principio de nuestro makefile,  de esta forma: CC=gcc Al igual que con GCC, tenemos disponible una ayuda en línea, que podemos consultar con info make. También encontraremos imprescindible el manual editado en el Proyecto GNU [1].

4. EL DEPURADOR GDB

Para poder depurar nuestro programa, previamente lo habremos compilado de forma que incluya información de
depuración, para que sea posible el seguimiento en el lenguaje fuente, la resolución de nombres de funciones y de variables, etc. Esto es tan sencillo como añadir el parámetro -g al compilador GCC. Como es lógico, el código compilado de esta forma ocupa más espacio que aquel que fue construido sin opciones de depuración. Por tanto, es conveniente que el programa final sea compilado sin esta información adicional.  Comenzamos nuestra sesión de depuración ejecutando nuestro programa a través de gdb, simplemente tecleando gdb miprograma. Desde gdb, podemos por ejemplo ver el listado de nuestro programa con el comando list, y añadir puntos de parada (breakpoints) con el comando break. Podemos establecer dichos puntos de parada ya sea nombrando la función en la que queremos que se detenga, o bien el número de línea del código fuente de nuestro programa: GDB 5.2.1, Copyright 1999 Free Soft...

(gdb) list
1 #include "foobar.h"
2
3 int main(int argc, char *argv[]) {
...
(gdb) break 5
Breakpoint 1 at 0x804834c: file main.c,
line 5.

Una vez detenido, podemos visualizar el contenido de las variables de la aplicación, modificarlas, visualizar la pila de ejecución (para comprobar las llamadas a funciones que se han hecho hasta entonces), o continuar la ejecución, ya sea paso a paso o como lo haría normalmente. He aquí una pequeña tabla con algunos de los comandos más ´útiles. Cuando un parámetro aparece entre corchetes significa que es opcional:
list [n] Mostrar código fuente [desde línea n] break n Marca punto ruptura en línea o fun. N run [n] Comienza ejecución [con argumentos n] print exp Muestra valor de expresión exp display exp Muestra cada vez que avanza un paso next Avanza un paso a través de subrutinas nexti Avanza 1 instrucc., procede subrutinas continue Continúa la ejecución del programa bt Imprime contenido de pila de ejecución Por ejemplo, una vez establecido el punto de ruptura anterior, podríamos haber comenzado la ejecución, esperar a que gdb detenga el programa, y mostrar el contenido de la variable entera argc, para finalizar observando los marcos de la pila de ejecución:

(gdb) run
Starting program: miprograma
Breakpoint 1, main ...
5 printfoobar("Hola, soy foobar");
(gdb) print argc
$1 = 1
(gdb) bt
#0 main (argc=1, argv=0xbffff7a4) at...
#1 0x4004112d in __libc_start_main()...

El depurador gdb dispone de una ayuda interna, que puede ser invocada con help. Esto mostrará una lista de
secciones en las que están divididas los distintos comandos que podemos usar para controlar nuestro programa. Con sólo hacer help sección, observaremos una de esas listas, y help comando nos ofrecerá una breve ayuda acerca de un comando concreto. No obstante, al igual que las herramientas anteriores, se dispone de una ayuda en línea en formato texinfo, invocable a través de info gdb. También hay un manual técnico elaborado por el Proyecto GNU [2].

5. EL PROFILER GPROF

Como ya se dijo, a menudo deseamos optimizar el rendimiento de nuestro programa, pero en determinadas ocasiones resulta difícil conocer dónde están localizados los cuellos de botella. Bien podría ser una función que consuma una gran cantidad de tiempo de ejecución, como alguna otra que, aunque muy rápida, se ejecuta demasiadas veces. Esto nos permitiría optimizar de manera adecuada nuestra aplicación, sustituyendo por macros o funciones inline aquellas más llamadas (para eliminar el retardo de resolución de la llamada) y mejorando el código en sí. Para compilar nuestra aplicación de forma que gconf pueda posteriormente extraer toda esta información, simplemente añadimos el parámetro -pg al compilador GCC. Una vez hecho esto, procedemos a ejecutar el programa en sí, y tras salir correctamente de ´el (al finalizar main(), o tras un exit()), observaremos que se ha generado un nuevo fichero en el directorio de trabajo llamado gmon.out. Sólo nos queda pasar este archivo a través de gconf, con el siguiente formato: gconf <opciones> <ejecutable> <gmon.out>

En nuestro sempiterno ejemplo de programa, haríamos gconf miprograma gmon.out. Hay una opción que merece la pena destacar, que nos muestra el código fuente de nuestro programa junto con un conteo de ejecuciones por l´ınea. Esta opción se activa con el parámetro -A.  Una vez más, ampliaremos nuestros conocimientos acerca de esta herramienta usando el comando info gprof, o bien con la lectura del manual de GNU [3].

6. LA HERRAMIENTA AUTOCONF

Terminamos viendo una herramienta que, con el tiempo, se ha convertido en una de las más útiles y necesarias
a la hora de desarrollar software multiplataforma. Las diferencias entre ´estas obliga al programador a conocerlas con detalle. Con autoconf, podremos generar un script que nos evite la mayor parte del trabajo. Este script, llamado configure, generara unos ficheros makefile modificados para adaptarse a nuestro sistema.
El modo de funcionamiento de autoconf se basa en el uso de macros m4 para resumir las operaciones de comprobación que deben hacerse. Estas macros comienzan todas con el prefijo AC y son sustituidas por una porción de código en el lenguaje de script de una shell tipo Bourne. Las macros se definen en un fichero configure.in, y al ser procesado este fichero con autoconf, se generar ´a el correspondiente script configure. Sólo dos macros son imprescindibles para nuestro programa: AC_INIT(fichero_unico_fuentes)
La llamada a AC INIT comprueba que existe el fichero indicado para asegurarse de que se encuentra en el directorio correcto. En nuestro ejemplo, podríamos usar main.c. Se utiliza al comienzo del fichero de configuración. La otra llamada se sitúa al final del fichero, e indica donde se recogerán los resultados de la ejecución del script. Normalmente, el destino es el fichero makefile: AC_OUTPUT(fichero_salida) Una vez que nuestro script este listo, tras procesar el fichero configure.in con autoconf, ´este necesitara de un fichero adicional makefile.in que contenga nuestras reglas de compilación. Sólo que en este fichero, usaremos expresiones como CC=@CC@ que serán sustituidas por el script con el valor adecuado al generar el makefile final.  También podemos hacer exportar ciertas definiciones a un fichero config.h, que incluiremos en nuestras fuentes, sin más que definir el correspondiente config.h.in y usar la macro AC CONFIG HEADER para establecer dicho fichero de cabecera. Para facilitar la tarea de escritura de la cabecera config.h.in, tenemos a nuestra disposición una herramienta que viene con autoconf, llamada autoheader. Una vez que nuestro configure.in este listo, la usaremos para crear la cabecera de entrada. En configure.in podemos introducir comentarios, simplemente precediéndolos del modificador dnd al principio de la línea. Las macros que hay disponibles son muy numerosas, y como dicta la intuición, se pueden crear macros nuevas. Para este particular, es recomendable leer la guía en línea del lenguaje de macros M4, con info m4. Algunas macros de ejemplo son las siguientes:  

AC PROG CC : Decide qué compilador de C usar, seteando la variable CC.
AC CHECK PROG (prog) : Comprueba que el programa existe en el path actual.
AC CHECK LIB (lib, fun, action1, action2 : Determina si la función fun existe en la librer´ıa lib intentando enlazar un programa con lib. Ejecuta action1 si el test resultó ser correcto, o action2 en caso contrario.
AC CHECK HEADER (head) : Determina la existencia de la cabecera head.
AC C BIGENDIAN : Si los words (palabra del procesador) son guardados con los bits de mayor peso primero,
entonces define WORDS BIGENDIAN.
AC C INLINE : Si el compilador no soporta las palabras clave inline, inline o inline, entonces define inline como una cadena vac´ıa.
AC CONFIG HEADER : Fichero de cabecera donde irán las definiciones pertinentes para el código fuente de
nuestro programa. Como siempre, una de las mejores referencias de documentación se encuentra en el comando info autoconf. También en este caso, se elaboró un manual técnico [4] que es perfecto como material complementario.
Comandos para administrar un servidor Linux
Comando Chmod: Este comando sirve para modificar permisos de archivos. Hay dos formas de usarlo:
  1. chmod 777 miarchivo chmod 777 miarchivo
O esta otra: chmod g+x miarchivo
chmod g+x miarchivo
En el primer caso añadimos permisos de forma octal, mientras que en el segundo utilizamos la notación con letras. En el ejemplo añadimos el permiso ejecutar al grupo propietario del archivo. Podemos usar o+,o- para los otros usuarios, g+, g- para añadir o quitar permisos sobre el grupo, y u+, u- para los permisos del usuario propietario, seguidos de la letra r(read), w(write) o x(execute).
Comando Chown: Este comando sirve para cambiar el propietario de un archivo y se puede usar de la siguiente forma
  1. chown -R nuevopropietario /rutadelarchivo
chown -R nuevopropietario /rutadelarchivo
Comando Chgrp: El comando chgrp modifica el grupo propietario del archivo o directorio.
  1. chgrp nuevogrupo /rutadelarchivo
chgrp nuevogrupo /rutadelarchivo
Comando Du: Muestra el uso de disco de cada ARCHIVO y directorio (incluído sus subdirectorios).
  1. du
du
Si se quiere ver sólo el tamaño total de todos los archivos y directorios de una carpeta se puede usar este comando:
  1. du -ch | grep total
du -ch | grep total
Comando Grep: Este es un comando indispensable. Sirve para buscar cadenas de texto dentro de un archivo o dentro de otra cadena. Por ejemplo estas tres instrucciones devolverán el número de directorios que hay en el directorio actual. (ls es para listar todos los archivos y directorios y wc -l para contar el número de líneas
  1. ls -l | grep ^d | wc -l
ls -l | grep ^d | wc -l
En este otro ejemplo podemos ver el número de veces que está conectado el usuario root. Por ejemplo si tiene abiertas diferentes shells del sistema operativo a la vez. (who devuelve una cadena con todos los usuarios conectados)
  1. who | grep root | wc -l
who | grep root | wc -l
El comando grep soporta expresiones regulares y es lo que lo hace realmente potente, aunque siempre que se añaden expresiones regulares la cosa se complica. Supongamos que tenemos un fichero llamado archivo_prueba con los siguientes datos:
  1. dir 15kb 27/07/2007
  2. archivo 27kb 26/07/2007
  3. dualco 1kb 26/07/2007
dir 15kb 27/07/2007
archivo 27kb 26/07/2007
dualco 1kb 26/07/2007
Y sólo queremos que nos muestre las líneas que empiezan por la letra d. Esta sería la solución con el comando grep usando expresiones regulares.
  1. grep \'^[d]\' archivo_prueba
grep \'^[d]\' archivo_prueba
Comando Head: Devuelve las primeras líneas de un texto dado. Este ejemplo devolvería las primeras 10 líneas del archivo.
  1. head -n 10 archivo.c
head -n 10 archivo.c
Comando Kill: Este comando es muy útil para detener un proceso. Normalmente se utiliza el comando ps para buscar el PID (Process id o número identificador de proceso) y luego kill para 'matarlo'
  1. kill 174541
kill 174541
Donde este número es el PID del proceso.En algunas ocasiones usando este comando el proceso no se detendrá. En este caso podemos usar el parámetro -9 para darle más prioridad
  1. kill -9 174541
kill -9 174541
Comando Locate: Este comando sirve para localizar la ruta de un archivo en linux para saber dónde está guardado. Puede ser más rápido que find ya que almacena las rutas en una base de datos. Es especialmente útil cuando se conoce el nombre del programa pero no se recuerda la ruta. Es necesario actualizar el índice con el comando updatedb para que reindexe los archivos nuevos.
  1. updatedb
  2. locate archivo
updatedb
locate archivo
Si sólo se quieren mostrar 5 resultados se puede utilizar esta instrucción:
  1. locate "*.h" -n 5
locate "*.h" -n 5
Comando ls: Comando indispensable. Sirve para listar los archivos y directorios de una carpeta.
  1. ls /home/root/
ls /home/root/
Los parámetros más usados para esta función son posiblemente "-la". Ya que muestra información detallada sobre cada archivo y directorio (incluso los archivos ocultos):
  1. ls -la /home/root/
ls -la /home/root/
Comando man: Este comando se utiliza para llamar al Manual de Linux y preguntarle sobre un comando en concreto.
  1. man NOMBRECOMANDO
man NOMBRECOMANDO
Si el NOMBRECOMANDO existe, se nos abrirá la aplicación MAN con toda la información referente a ese comando, todas sus opciones y explicaciones. Este es un comando imprescindible para profundizar en el uso de Linux. Una vez se entra dentro de la aplicación man, se puede salir pulsando la tecla ESC y luego escribiendo :q Algunos comandos aceptan el parámetro --help para mostrarnos información de sus opciones. Podemos usar este método para no tener que llamar a man.
  1. NOMBRECOMANDO --help
NOMBRECOMANDO --help
Comando Tail: Este comando sirve para visualizar la parte final de un documento (en inglés tail signifia cola). Se puede usar en muchos casos, por ejemplo, supongamos que tenemos un log de errores del servidor web Apache que ocupa varios GB. Mostrarlo usando el comando cat error_log no sería una buena idea, y menos si lo único que queremos es ver un error reciente que está en las últimas líneas del fichero. En este caso esta instrucción nos vendría muy bien para que nos mostrara por pantalla las últimas 50 líneas del archivo error_log.
  1. tail error_log -n 50
tail error_log -n 50
Comando ps: El comando ps nos da una instantánea de todos los procesos que se están ejecutando en un momento determinado. Ver comando Top para mostrar los procesos en tiempo real. Aunque hay muchas opciones para filtrar y ordenar los procesos que muestra este comando, posiblemente la que más se usa suele ser
  1. ps aux
ps aux
Con estos parámetros se formatean los procesos mostrándo los atributos más importantes. Muchas veces se suele usar este comando junto con grep para encontrar un proceso en concreto
  1. ps aux | grep "nombredelproceso"
ps aux | grep "nombredelproceso"
Para detener un proceso se usa el comando Kill, también explicado en esta página.
Comando Top: Muestra toda la actividad de los procesos que se están ejecutando en tiempo real. Así como información varia del sistema, uptime, memoria, etc
  1. top
top
Para detener el comando pulsar control+c. Tiene multitud de opciones para ordenarlo según nuestras preferencias. Si mientras se está ejecutando se pulsa la tecla shift+m se ordena por los procesos que ocupan más memoria.
Comando Uptime: Muestra el tiempo que ha transcurrido desde que el sistema se abrió.
  1. uptime:
uptime
Además también muestra los usuarios que estan connectados al equipo en ese instante y las medias de carga en los últimos 1, 5 y 15 minutos.
Ls: list: listar. Es el primer comando que todo linuxero debe aprender. Nos muestra el contenido de la carpeta que le indiquemos después. Por ejemplo. Si queremos que nos muestre lo que contiene /etc:
$ ls /etc
Si no ponemos nada interpretará que lo que queremos ver es el contenido de la carpeta donde estamos actualmente:
$ ls
Además acepta ciertos argumentos que pueden ser interesantes. Para mostrar todos los archivos y carpetas, incluyendo los ocultos:
$ ls -a
Para mostrar los archivos y carpetas junto con los derechos que tiene, lo que ocupa, etc:
$ ls -l
Además se pueden solapar los argumentos. Si quisiéramos mostrar los archivos de la misma forma que antes, pero que muestre también los ocultos:
$ ls -la
·         cd: change directory: cambiar directorio. Podemos usarlo con rutas absolutas o relativas. En las absolutas le indicamos toda la ruta desde la raíz (/). Por ejemplo, estemos donde estemos, si escribimos en consola…
$ cd /etc/apt
…nos llevará a esa carpeta directamente. Del mismo modo si escribimos…
$ cd /
…nos mandará a la raíz del sistema de ficheros. Las rutas relativas son relativas a algo, y ese algo es la carpeta donde estemos actualmente. Imaginad que estamos en /home y queremos ir a una carpeta que se llama temporal dentro de vuestra carpeta personal. Con escribir…
$ cd tu_carpeta/temporal
…nos situará allí. Como véis hemos obviado el /home inicial ya que si no lo introducimos toma como referencia el directorio donde estamos, que es ese. ¿Y qué sucede si escribimos tan sólo…
$ cd
Sí, sólo “cd”. Esto lo que hace es que te lleva a tu carpeta personal directamente y estemos donde estemos. Es algo realmente muy práctico, muy simple y que no todos conocen.
·         Mkdir: make directory: hacer directorio. Crea una carpeta con el nombre que le indiquemos. Nuevamente podemos usar rutas absolutas y relativas. Podemos indicarle toda la ruta que le precede al directorio que queremos crear, o si estamos ya en la carpeta que lo va a contener basta con poner tan sólo el nombre:
$ mkdir /home/tu_cuenta/pepino
Si ya estamos en /home/tu_cuenta…
$ mkdir pepino
·         rm: remove: borrar. Borra el archivo o la carpeta que le indiquemos. Como antes se puede indicar la ruta completa o el nombre del archivo. Esto a partir de ahora lo vamos a obviar, creo que ya ha quedado claro con los dos comandos anteriores.Para borrar un archivo:
$ rm nombre_archivo
Para borrar una carpeta vacía:
rm nombre_carpeta
Para borrar una carpeta que contiene archivos y/o otras carpetas que pueden incluso contener más:
rm -r nombre_carpeta
Otras opciones: “-f” no te pide una confirmación para eliminar o “-v” va mostrando lo que va borrando.
·         Cp: copy: copiar. Copia el archivo indicado donde le digamos. Aquí podemos también jugar con las rutas, tanto para el fichero origen, como en el del destino. También podéis poner el nombre que le queréis poner a la copia. Por ejemplo, si estuviéramos en /etc/X11 y quisiéramos hacer una copia de seguridad de xorg.conf en nuestra carpeta personal:
$ cp xorg.conf /home/tu_carpeta/xorg.conf.backup

mv: move: mover. Es igual que el anterior, sólo que en lugar de hacer una copia, mueve directamente el archivo con el nombre que le indiquemos, puede ser otro distinto al original:
$ mv /etc/pepino.html /home/tu_carpeta/ese_pepino.html
Otro uso muy práctico que se le puede dar es para renombrar un archivo. Basta con indicar el nuevo nombre en el segundo argumento con la misma ruta del primero. En este ejemplo suponemos que ya estamos en la carpeta que lo contiene:
$ mv pepino.html ese_pepino.html
find: encontrar. Busca el archivo o carpeta que le indiques:
$ find / -name pepino
El comando anterior buscaría en todos los sitios las carpetas y archivos que se llamen pepino. Si tuviéramos la seguridad de que se encuentra en /var por ejemplo, se lo indicaríamos:
$ find /var -name pepino
Si no estamos muy seguros del nombre podemos indicárselo con comodines. Supongamos que el nombre de lo que buscamos contiene “pepi”, en la misma carpeta de antes:
$ find /var -name *pepi*
Tiene otras opciones. Por ejemplo podemos decirle que encuentre los archivos/carpetas de más de 1500 KB:
$ find / -size +1500
O los archivos/carpetas contienen el nombre “pepi” y tienen menos de 1000 KB:
$ find / -name *pepi* -size -1000
clear: despejar. Limpia la pantalla/consola quedándola como si acabáramos de abrirla.
$ clear
·         ps
process status: estado de los procesos. Nos muestra lo que queramos saber de los procesos que están corriendo en nuestro sistema. Cada proceso está identificado con un número llamado PID. Si hacemos…
$ ps -A
…nos mostrará un listado de todos los procesos, su PID a la izquierda y su nombre a la derecha. Si queremos más información:
$ ps aux
kill: matar. Elimina el proceso que le indiquemos con su PID:
$ kill
En ocasiones el proceso no “muere” del todo, pero se le puede forzar al sistema para que lo mate con seguridad del siguiente modo:
$ kill -9
·         sudo: super-user do: hacer como superusuario. La cuenta de usuario en Ubuntu es relativamente normal. Tiene derechos de administrador a medias. Me explico, los tiene, pero cada vez que se haga algo importante y de riesgo para el sistema, hay que hacerlo mediante el prefijo “sudo” y escribiendo después la contraseña. Por ejemplo, algo que hemos hecho muchas veces en los tutoriales es hacer una copia de seguridad del fichero xorg.conf. Éste está localizado en la carpeta /etc/X11 y ahí ningún usuario puede hacer modificaciones o borrar nada si no es el administrador o tiene derechos como tal, gracias a sudo. Por eso hacíamos siempre:
$ sudo cp /etc/X11/xorg.conf /etc/X11/xorg.conf
Siempre que necesitemos hacer un apt-get/aptitude update o install y acciones de este tipo, tendremos que poner antes el “sudo”.
·         Passwd: password: contraseña. Con este comando podremos cambiar la contraseña de nuestra cuenta. Primero nos pedirá la contraseña actual como medida de seguridad. Después nos pedirá que introduzcamos dos veces seguidas la nueva contraseña.
$ passwd
·         su: super-user: superusuario. Mediante su podremos loguearnos como superusuario. Tras escribirlo nos pedirá la contraseña de root y estaremos como administrador. Podremos hacer todo lo que queramos.
$ su
Este comando también nos permite hacer login con otra cuenta distinta. Por ejemplo, imaginemos que tenemos otra cuenta, además de root y la nuestra, llamada “invitado”. Para hacer login como tal bastaría con poner:
$ su invitado
y después escribir la contraseña de esa cuenta.
·         sudo passwd
No es un comando propiamente dicho, pero es interesante que lo conozcáis. Gracias a la unión de estos dos comandos podréis cambiar la contraseña de root (la del super-usuario).
$ sudo passwd
·         apt: advanced packets tool: herramienta avanzada de paquetes. Es uno de los comandos más útiles que se han desarrollado en los sistemas GNU/Linux debian o basados en esta distro. Nos permite comprobar actualizaciones, actualizar todo el sistema. También nos ofrece funcionalidad para buscar, descargar e instalar paquetes con una sola orden.Tenemos variantes, las más usadas son las siguientes:
$ apt-cache search nombre_paquete
Busca nombre_paquete para ver si existe literal o aproximadamente ofreciéndonos los paquetes que pudieran ser en caso de que hayamos puesto un nombre aproximado.
$ apt-get update
Actualiza los repositorios que son los que contienen los paquetes. Los repositorios son como las direcciones que contienen nuestros paquetes. apt-get update lo que hace es actualizar el listado de todos esos paquetes, con la dirección de dónde obtenerlos para que a la hora de hacer la búsqueda y su posterior descarga sea más rápida haciéndolo en nuestro ordenador.
$ apt-get upgrade
Actualiza nuestro sistema con todas las posibles actualizaciones que pudiera haber. La actualización no se realiza sólo sobre el propio sistema operativo, sino también sobre las aplicaciones que estén contenidas en los repositorios. Una útil forma de estar siempre al día.
$ apt-get install nombre_paquete
Localizado el nombre del paquete que queremos descargar e instalar, este comando se encargará del proceso. Buscará en nuestro índice (el que se crea con update) de dónde tiene que descargarse el paquete, lo hace y posteriormente lo instala.
$ apt-get remove [--purge] nombre_paquete
Elimina el paquete especificado del sistema. Damite el argumento “–purge” (corchetes = opcional) para que borre también los ficheros de configuración.
$ apt-get autoremove
Elimina paquetes que han quedado inservibles tras realizar algún apt-get remove, los llamados huérfanos. Normalmente tras hacer este último te avisa en un mensaje que lo realices. Todos estos comandos necesitan tener privilegios de administración, así que si no los usáis como root, debéis agregar primero el conocido “sudo”.
aptitude: aptitud, habilidad. En el fondo juega con las siglas de apt para crear aptitude. Es una versión mejorada de apt. Si os habéis fijado en todos los manuales y entradas donde había un proceso de instalación he usado aptitude en lugar de apt. El segundo es quizá el más extendido al ser el que vio la luz primero. aptitude nació como un front-end de apt, es decir, como una especie de aplicación gráfica y en modo texto para realizar todo lo que hace apt. Pero lo cierto es que sus características son mejores. apt cuando instala algo te puede realizar una sugerencia para que instales algo más que te podría venir bien, pero no lo hace. Hay programas que a la vez usan otros para algunas de sus funciones u opciones. apt no instalaría los segundos, como mucho te avisaría. Sin embargo aptitude sí que lo instalará porque sabe que de alguna forma es indispensable para el que has pedido. De la misma forma, si con apt instalas luego ese programa que es usado por otro, cuando desinstalas el principal, no se desinstalará el secundario, aunque éste ya no tenga mucho sentido que esté instalado, y lo mismo sucede con librerías. aptitude está capacitado para desinstalar lo que él mismo ha instalado como recomendación. Te deja el sistema más limpio tras las desinstalaciones. Para abrir el interfaz gráfico de aptitude, tan sólo hay que teclearlo:
$ aptitude
Sin embargo, también se puede usar exactamente igual que apt, pero con las características que he comentado de aptitude:
$ aptitude search nombre_paquete
$ aptitude install nombre_paquete
$ aptitude remove nombre_paquete
$ aptitude purge nombre_paquete
$ aptitude update
$ aptitude upgrade
Y al igual que antes, necesitaréis usarlo con el sudo delante si no estáis como administrador.
·         Dpkg: depackage: despaquetar. Los paquetes cuando se instalan sufren un proceso de despaquetaje. En el fondo un paquete .deb contiene una serie de scripts de pre-instalación, post-instalación y los archivos en cuestión del paquete. Este comando lo usaremos para instalar un paquete .deb que ya tengamos descargados en nuestro sistema. En muchas ocasiones hay una aplicación que no está en los repositorios y nos hemos bajado el .deb para instalarlo con el interfaz gráfico que corresponda (GDebi en el caso de GNOME). En el fondo estas interfaces gráficas están basadas en dpkg. Si queremos instalar un paquete ya descargado mediante consola usaremos el argumento ‘-i’ (i=install):
$ dpkg -i nombre_paquete
Para desinstalarlo ‘-r’ (r=remove):
$ dpkg -r nombre_paquete
Para desinstalar el paquete y los ficheros de configuración “–purge” (purgar):
$ dpkg -r –purge nombre_paquete
Alien: de otro país, de otro planeta. Aunque Debian -y por extensión Ubuntu- dispone de una ingente cantidad de paquetes en sus repositorios, puede que alguien tenga algún problema en encontrar una aplicación específica empaquetada como le interesa aunque ha visto el paquete que quiere para otras distros. alien es bastante práctico para estas situaciones ya que nos permite transformar un paquete de un gestor de paquetes determinado en otro. Por ejemplo podemos pasar de un .deb (Debian) a un .rpm (Red Hat) y viceversa. Las extensiones soportadas son:
* deb (Debian)
* rpm (Red Hat)
* slm (Stampede)
* tgz (Slackware)
* pkg (Solaris)
Su uso es sencillo. Lo que debemos saber es el argumento que transformará el paquete original en la extensión objetivo:
* “–to-deb” o “-d” para transformar a .deb
* “–to-rpm” o “-r” para transformar a .rpm
* “–to-tgz” o “-t” para transformar a .tgz
* “–to-pkg” o “-p” para transformar a .pkg
* “–to-slp” para transformar a .slp
Como ejemplo, pasaremos un supuesto paquete de Red Hat llamado “pepino.rpm” a “pepino.deb”:
$ alien -d pepino.rpm
·         man
manual: manual. Es otro de los comandos de gran potencia en linux. Normalmente queda programa o comando viene con un archivo de ayuda muy completo sobre su uso y sus argumentos. Cuando desconozcáis cómo se usa y qué argumentos tiene un comando o aplicación tan sólo tenéis que escribir en consola:
$ man nombre
En ocasiones la información que nos ofrece man puede llegar a ser excesiva. Casi todos los comandos y aplicaicones aceptan el argumento “–help” para que muestre cierta ayuda más resumida. Por ejemplo con aptitude:
$ aptitude –help
Todos los comandos que os he mostrado tienen muchos más argumentos. Os he puesto los más usados o necesarios, así que si hay alguno que os interesa particularmente conocer más de él, tenéis “man” o “–help” para obtener más detalles.
Sobre cd:
$ cd -
Nos devuelve al último directorio en el que estuviéramos. Lo descubrí por accidente.
Es muy práctico cuando queremos editar ficheros en dos lugares.
$ cd /etc/X11/
$ cd /backup/
$ cd -
Nos lleva a /etc/X11
$ cd -
nos devuelve a /backup
Sobre cp: Para copiar un directorio se usa cp -r
$ cp -r /etc /backup/
Tendremos /backup/etc, y dentro de ese directorio tendremos lo mismo que hay en /etc
Muy útil.
Sobre mv: Tambien permite mover directorios o renombrarlos
$ mv /home/yo/misdocumentos /home/yo/mis_documentos
Sobre kill: apenas lo uso, en su lugar utilizo killall, que permite matar por nombre de proceso, y los procesos llamarse siempre igual (no así sus pid), permite no tener que hacer un ps para saber qué tienes que poner.
$ killall firefox-bin
Eso sí, no es útil si tienes varios procesos abiertos con el mismo nombre, puesto que los cerrará todos.
También acepta entre killall y el nombre del proceso un -X, donde X es la señal que quieras (9 para matarlo, 15 para que intente cerrar él solo)
$ killall -15 firefox-bin (vaya, no va)
$ killall -9 firefox-bin
alias: permite crear atajos para comandos ej,:
$ alias ll=”ls -l”
$ alias instala=”sudo aptitude install”
también se pueden dejar permanentes, para agregar los alias permanentemente editan el archivo:
$ nano /home/usuario/.bashrc
(puede ser nano, kate, gedit) y agregan al final del archivo sus alias
alias actualiza=”sudo aptitude update”
alias upgrade=”sudo aptitude upgrade”
alias instala=”sudo aptitude install”
alias purge=”sudo aptitude purge”
alias show=”sudo aptitude show”
alias busca=”sudo aptitude search”
alias apagate=”sudo shutdown -h now”
luego cierran la terminal, abren otra y listo y hay una pequeña aplicacion que puede ayudar si no nos acordamos de algunos comandos “mc” para instalar:
$ sudo aptitude install mc
o si tenemos el alias =) :
$ instala mc
Para el manejo de archivos:

cd - sirve para cambiar el directorio
compress - con este comando se comprimen archivos en formato .Z
cp - hace una copia de un archivo
chmod - cambia los permisos de un archivo o directorio
chown - cambia el propietario del archivo o directorio
df - muestra el espacio libre en disco
du - muestra el espacio utilizado en disco
fdformat - formatea un disquete
fdisk - se utiliza para particiona unidades
file - determina el tipo de archivo a través del análisis parcial de su contenido
find - hace una búsqueda a un archivo determinado
fsck - examina el sistema de archivos
gzip - descomprime un archivo en formato GZip
ln - crea un enlace simbólico o físico, dependiendo de la opción
ls - lista el contenido de un directorio
mkdir - crea un directorio
mkfs - crea un nuevo sistema de archivos
mkswap - crea un espacio de intercambio
more - muestra el contenido de un archivo
mount - monta una unidad o partición en el sistema de archivos
mv - mueve un archivo y también se utiliza para renombrar
pwd - devuelve la cadena correspondiente al directorio actual
rm - borra un archivo
rmdir - borra un directorio
swapon - activa el espacio de intercambio
swapoff - desactiva el espacio de intercambio
tar - empaqueta o desempaqueta un archivo en formato .tar
type - muestra la ubicación de un archivo señalando su "path"
umount - desmonta una unidad o partición en el sistema de archivos


Para el manejo de procesos:

free - muestra la memoria libre y utilizada
halt - apaga la maquina
kill - mata un proceso señalando el número de éste
ldd - muestra las librerías necesarias para ejecutar un proceso
ps - muestra todos los procesos que se están ejecutando en el sistema
pstree - muestra todos los procesos que se están ejecutando en el sistema, pero en forma de árbol
reboot - reinicia el sistema
shutdown - cierra el sistema
top - monitorea procesos y el estado del sistema
uname - muestra información del sistema


Para el manejo de usuarios:

adduser - crea una cuenta de usuario
chsh - este comando cambia la shell de un usuario
groups - muestra el listado de grupos de usuarios del sistema
id - muestra la información de usuario y grupo de un determinado usuario
logout - se sale del sistema deslogueando al usuarui, peromitiendo iniciar sesión con otro usuario
passwd - cambia la contraseña de un determinado usuario
su - le da privilegios de root (administrador) a un usuario
talk - permite hablar con otros usuarios
users - lista los usuarios conectados al sistema
who - muestra información de los usuarios conectados al sistema
whoami - muestra nuestra información


De red:

ping - manda paquetes esperando una respuesta del lugar que le indiquemos
ifconfig - muestras las tarjetas de red (Ethernet)
iwconfig - muestra Las tarjetas de red (Wifi)
host "destino" - muestra la IP del "destino"


Para el manejo de paquetes:

rpm - "opcion" "paquete" - instala o desinstala el "paquete" dependiendo de la opción
dpkg - "opcion" "paquete" - instala o desinstala el "paquete" dependiendo de la opción, este comando solo sirve para paquetes debian.
tar - "opcion" "paquete" - comprime o descomprime el "paquete" de formato tar.gz, tar.tgz o tar.bz2
FUENTES DE INFORMACIÓN:
BIBLIOGRAFÍA

[1] Richard M. Stallman and Roland McGrath, GNU Make, Free Software Foundation, April 2000.
[2] Richard M. Stallman and Roland H. Pesch, Debugging
with GDB, Free Software Foundation, April 1998.
[3] Jay Feulason and Richard M. Stallman, GNU gprof, Free Software Foundation.
[4] David MacKenzie and Ben Elliston, Autoconf, Free Software Foundation, July 2001