Professional Documents
Culture Documents
Índice
1. Introducción 2
2. Compilar en GNU/Linux 3
2.1. Lo básico de GCC . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2. Desarrollando programas grandes . . . . . . . . . . . . . . . . . . 3
2.3. La utilidad make y el archivo Makefile . . . . . . . . . . . . . . . 4
2.4. Variables del archivo Makefile . . . . . . . . . . . . . . . . . . . . 5
2.5. Etiquetas utiles para el archivo Makefile . . . . . . . . . . . . . . 5
4. Misceláneas 9
4.1. Crear archivos log mediante la redirección del archivo stderr . . . 9
4.2. Cambiar el nombre de un proceso . . . . . . . . . . . . . . . . . . 10
4.3. Ejecutar un programa como hijo de un proceso . . . . . . . . . . 10
4.4. Atender Señales . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4.5. Manejo de pantalla y colores sin utilizar ncurses . . . . . . . . . . 12
4.6. Programas auxiliares . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.7. Evitar procesos zombies y defunct . . . . . . . . . . . . . . . . . 14
4.8. Utilizar tar y gzip para comprimir y descomprimir . . . . . . . . 14
4.9. Documentos recomendados . . . . . . . . . . . . . . . . . . . . . 15
4.10. Resumen de gdb para encontrar rápidamente causas de un Seg-
mentation Fault . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.11. Realizar una pausa de n segundos . . . . . . . . . . . . . . . . . . 15
1
1. Introducción
Esta guia es desarrollada con la intención de ayudar a los estudiantes que
cursan la materia Sistemas Operativos de la UTN FRBA, el documento es breve
para cumplir con las necesidades de tiempo de los estudiantes.
Última versión
Podes encontrar la última versión de este documento en:
www.apuntes-utn.com.ar
2
2. Compilar en GNU/Linux
2.1. Lo básico de GCC
El comando gcc es utilizado para compilar programas escritos principalmente
en lenguaje C, por defecto este programa realiza varias acciones: preprocesa,
compila y asocia el ejecutable (link), el comando :
// archivo main.c
#include "utils.h"
int main(void)
{
ImprimirMensaje();
return 0;
}
// archivo utils.h
void ImprimirMensaje(void);
// archivo utils.c
3
#include <stdio.h>
void ImprimirMensaje(void)
{
printf("Ejemplo básico con dos módulos\n");
}
./ejecutable
Nota: en este caso para que main.c pueda ser compilado es necesario que
GCC conozca todas las cabeceras de la funciones llamadas, para este propósito
se utilizan los archivos .h que solo deben contener declaraciones de estructuras
y cabeceras de funciones.
#archivo Makefile
main.o: main.c
gcc -o main.o -c main.c
utils.o: utils.c
gcc -o utils.o -c utils.c
4
Nota: Todas la lineas que especifican un comando deben comenzar con una
tabulación, en este caso antes de gcc
De esta forma al ejecutar make, el programa interpretara el archivo Make-
file intentando cumplir el primer objetivo (ejecutable), para ello necesita que los
archivos main.o y utils.o existan y estén actualizados, si esto se cumple make eje-
cutará la siguiente linea que comienza con tabulación (gcc -o ejecutable main.o
utils.o). En cambio, si alguno de los archivos dentro de sus dependencias no
existe o está desactualizado, make intentará generarlo y este será su nuevo ob-
jetivo a cumplir, este proceso se repite hasta lograr el objetivo inicial.
#archivo Makefile:
CC = gcc
CCFLAGS = -Wall
main.o: main.c
$(CC) $(CCFLAGS) -o $@ -c $^
utils.o: utils.c
$(CC) $(CCFLAGS) -o $@ -c $^
5
clean:
rm -f *.o ejecutable
exportar: clear
rm -f proyecto.tgz
tar czf proyecto.tgz *
Ahora cuando queramos limpiar nuestro trabajo, dado que los archivos .o
ocupan mucho espacio, ejecutamos:
make clean
Cuando realicemos la entrega del trabajo practico vı́a e-mail podemos eje-
cutar:
make exportar
6
3. Utilizar el editor de texto VIM
3.1. Introducción
En esta guia lo que trato de hacer es poder darles una introducción acerca
de este rápido y eficiente editor de texto. NO es mi objetivo imponer una moda
ni tampoco imponer ningún tipo de gusto personal, pero es un editor muy in-
teresante y bastante útil. VIM es una versión de vi pero mejorada VIM=VI+IM
(improved que quiere decir mejorado).Tampoco es posible especificar todos los
comandos o posibilidades del editor, me limitaré solo a aquellos que me resul-
taron mas útiles
vim archivo
Nota: A partir de ahora indicaré entre paréntesis la tecla que se debe utilizar
en el editor
Visual (CTRL + v)
Comandos (:)
7
3.3. En el modo Orden
Como indica el subtitulo debemos encontrarnos en modo Orden (ESC)
8
4. Misceláneas
4.1. Crear archivos log mediante la redirección del archivo
stderr
Uno de los requisitos indispensables para cada entrega del trabajo practico
son los reportes log: mientras el programa corre debe informar directamente en
un archivo cada una de las tareas que realiza.
Veamos una de las tantas formas de realizar esto con dos funciones, la primera
genera el archivo log y lo asigna a stderr, la segunda registra un evento del
programa en el archivo:
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <unistd.h>
if (arch != NULL)
stderr = arch;
}
switch (iTipo)
{
case 1:
strcpy(czTipoEvento, "Información");
break;
9
case 2:
strcpy(czTipoEvento, "Error");
break;
case 3:
strcpy(czTipoEvento, "Mensaje");
break;
}
[...]
[...]
#include <unistd.h>
void EjecutarProceso(void)
10
{
int iPid;
Estas son las señales mas conocidas (con ’man 7 signal’ se puede consultar
el resto):
#include <signal.h>
#include <stdio.h>
11
void CapturadorSignal(int iSignal);
int main(void)
{
printf("Iniciando el programa\n");
while (1)
{
}
}
switch (iSignal)
{
case SIGINT:
printf("llegó la se~
nal SIGINT\n");
break;
case SIGTERM:
printf("Llegó la se~
nal SIGTERM\n");
break;
}
printf("Terminado el programa\n");
/* liberar listas */
exit(-1);
}
12
este carácter se debe especificar el código a ejecutar y, opcionalmente, una ca-
dena de caracteres; veamos un ejemplo:
[..]
[..]
13
killall - Envı́a una señal a varios procesos juntos.
Nota: Cada una de las utilidades puede realizar muchas tareas, la descrip-
ción corresponde a las tareas mas comunes que realizaremos con cada programa.
para descomprimir:
14
4.9. Documentos recomendados
- www.geocities.com/chuidiang, contiene varios documentos de programación
avanzada en C sobre Linux/Unix. Se tratan temas como socket, procesos, hilos,
memoria compartida, semáforos, señales, makefiles... etc. [CASTELLANO]
gdb ejecutable
run
Ejecutamos el programa hasta que este caiga, la mayorı́a de las veces cae
por la llegada de la señal SIGSEGV (Segmentation Fault)
where
15
nos resultarı́a muy costoso (en términos de recursos).
Una posibilidad, que no consume tantos recursos de sistema es:
tv.tv_sec = iSegundos;
tv.tv_usec = 0;
select (1, NULL, NULL, NULL, &tv);
}
tv.tv_sec = 0;
tv.tv_usec = iMS * 1000000;
select(1, NULL, NULL, NULL, &tv);
}
16