LABORATORIO C BÁSICO EN LINUX
Grupo:
Cajal, Fernando Alexis. Legajo: 50343.
Furmanski, Lucas Javier. Legajo: 56456.
Castillo, Lucila. Legajo: 48270.
Introducción
Ahora nos pondremos en la tarea crear un programa en C, y luego compilarlo. Para editar el código
fuente necesitamos usar un editor de texto. Si nos encontramos con una consola de texto, podemos
usar nano, por ejemplo, y podemos comenzar invocando el comando seguido del nombre del archivo
a editar, ya sea que éste exista o no:
nano ejercicio_1.c
Una vez terminado de editar el código podemos salir (en caso de usar nano, tener en cuenta que el
menú de abajo en la pantalla indica con el símbolo ^ que debe presionar la tecla Ctrl, y compilarlo, o
bien guardar sin salir (:w) y realizar la compilación en otra consola o terminal.
En caso de encontrarse en entorno de texto (no gráfico), puede abrir una nueva consola virtual
(cambiando con Alt-F1 a F6) iniciar sesión y realizar la compilación. Este último método permite
alternar entre la línea de comandos (para compilar) y el código fuente (para editar) con mayor rapidez.
Es como tener ventanas en el entorno gráfico.
Otra alternativa recomendable si se dispone de entorno gráfico, es usar Geany, que es un editor
avanzado que presenta características de un entorno de desarrollo integrado (IDE). Tenga en cuenta
que, si bien Geany provee la opción de compilar presionando un botón, en este TP se requiere que la
compilación sea hecha por comandos desde una consola o terminal, como se indica a continuación.
Para compilar, básicamente debemos invocar al compilador (gcc) seguido del nombre del archivo con
el código fuente (extensión .c). La opción -o nos permite especificar el nombre del ejecutable que se
creará como resultado del proceso. De ser omitida dicha opción, el nombre del ejecutable será a.out.
En el ejemplo siguiente se muestra la línea de comandos para compilar el código en el archivo
ejercicio_1.c y para nombre del ejecutable será ejercicio_1 (notar la ausencia de la extensión .c) en el
nombre del ejecutable.
gcc ejercicio_1.c -o ejercicio_1
En caso de que el compilador encuentre errores, serán presentados por pantalla, indicando el número
de línea en el cual se encuentran (habrá que corregirlos y recompilar). De otro modo, la compilación
resultó exitosa y el archivo ejecutable ejercicio_1 debería estar en el directorio actual.
Podemos verificar su existencia listando contenido del directorio (con dir o ls). Para ejecutarlo alcanza
con el comando:
1
./ejercicio_1
Para cancelar la ejecución del programa (antes de que finalice), presione Ctrl-c.
Cabe destacar que olvidarse de guardar el archivo fuente luego de modificarlo, y olvidarse de
recompilar el código luego de modificaciones son errores comunes que deben ser evitados poniendo
atención. Otro punto a tener en cuenta es que el archivo a ejecutar, valga la redundancia, debe ser el
ejecutable generado como resultado de la compilación (a.out, o ejercicio_1, por ejemplo), y no el código
fuente. Intentar ejecutar ejercicio_1.c (notar la extensión) resultará probablemente en un error, por
ser un archivo de texto, no un ejecutable.
Al trabajar en la consola de texto, no es necesario incluír al final del programa instrucciones como las
que se usan en el entorno Windows, tales como getch() o system("pause"),puesto que (aparte de no
funcionar en Linux), la consola no se cerrará al finalizar la ejecución. La librería conio no está instalada,
no la use.
Otra sugerencia es que no intente escribir el código completo del programa antes de compilar. En
cambio, lo recomendable es escribir un fragmento del código, compilar, depurar y ejecutar, y si
funciona bien, recién continuar con otro fragmento del código.
Cuestionario de control
De manera individual, es decir, no grupal, lea el texto anterior y responda las siguientes preguntas, a
modo de control de lectura.
a. ¿Cómo se llama el compilador?
El compilador se llama gcc.
b. ¿Para qué sirve la opción -o?
Sirve para nombrar el archivo ejecutable que se crea al compilar el archivo a ejecutar.
c. ¿Qué sucede cuando no se establece la opción -o?
El nombre del archivo ejecutable por defecto se llama a.out .
d. ¿Cómo sé si la compilación tuvo éxito?
Luego de compilar exitosamente, el archivo ejecutable debería existir en el directorio actual.
e. ¿Qué comando debo tipear para ejecutar el programa compilado si no usé la opción -o?
Se debe tipear los comandos ls o dir, para verificar la existencia del archivo ejecutable.
f. ¿Qué librería no debo usar?
No se debe usar la librería conio.
2
g. Si hago cambios en el programa, pero al ejecutar sigue igual que la vez anterior, ¿qué puede estar
pasando?
Lo que puede estar pasando es que se olvidó de recompilar el código fuente.
Ejercicios
1. Cree un programa que lea 10 números enteros tanto positivos como negativos ingresados por el
teclado y presente su máximo, mínimo y promedio al finalizar.
Ejercicio_1.cpp
2. Cree un programa que lea números enteros tanto positivos como negativos ingresados por el teclado
hasta tanto se ingrese el número cero y presente su máximo, mínimo y promedio al finalizar.
Ejercicio_2.cpp
3. Modifique el programa del punto 1 para que al ingresar el texto "salir" termine de inmediato sin
presentar resultados; y al ingresar el texto "resultados" termine presentando los resultados.
Ejercicio_3.cpp
4. Cree un programa que lea una cadena de texto de hasta 100 caracteres ingresada por teclado y cuente
su cantidad de palabras.
Ejercicio_4.cpp
5. Cree un programa que lea cadenas de texto de hasta 100 caracteres ingresadas por teclado y vaya
presentándolas por pantalla concatenadas, hasta que se ingrese el número 0, momento en el cual deberá
presentarse la cantidad total de cadenas ingresadas, y la cantidad total de palabras.
3
Ejercicio_5.cpp
6. Descargue el código del programa con el siguiente comando:
wget http://soutn.ernet.com.ar/descargas/programas/recorrer_matriz.c
Lea el programa y modifíquelo para que recorra la matriz, leyendo cada una de sus celdas y colocando
su valor en la variable 'contenido'. No importa que el valor se sobreescriba, es sólo para realizar una
lectura desde memoria. Ejecute y verifique su funcionamiento correcto. En caso de encontrarse con un
error de "certificado no confiable", use el comando wget con la opción --no-check-certificate.
Luego, utilice alguna de las herramientas del sistema vistas en trabajos anteriores para averiguar la
cantidad de memoria principal disponible (es decir, libre). Ajuste el tamaño de la constante BASE para
que el tamaño de la matriz sea cercano a la memoria libre. Se permite una diferencia de hasta 50 MB.
Verifique la ejecución correcta del programa.
A fines de mejorar la precisión de las mediciones subsiguientes, encierre el recorrido de la matriz en un
lazo más, para que se recorra un total de 100 veces por ejecución.
4
Luego de esto:
a. Ejecute 5 veces el programa, anotando los tiempos de ejecución en cada caso.
b. Invierta el modo en que recorre la matriz. Por ejemplo, si era [i][j], use [j][i]. Compile y ejecute 5 veces
más, también anotando los tiempos.
5
c. ¿Hay diferencia en el modo en que se recorre la matriz? De ser así, ¿a qué podría deberse?
Al acceder a los elementos de la matriz, la CPU no lee solo un elemento de la memoria a la vez, sino que
lee los elementos de una región. Al acceder al primer elemento, la CPU también leerá sus elementos
adyacentes. Con el creciente número de elementos de la matriz, el caché de la CPU solo puede leer
menos de una fila de datos en la matriz a la vez, por lo que al acceder a los elementos por columna, se
debe acceder a cada elemento en la memoria, por lo que la velocidad será mucho más lenta.
Investigue las siguientes características de la máquina que está utilizando (no importa si es máquina
virtual):
Frecuencia de CPU, frecuencia de RAM, frecuencia del bus, tasa de transferencia máxima de RAM, tamaño
de cachés, tamaño de la línea de los cachés.
Puede obtener algunos datos del CPU ejecutando en la terminal:
cat /proc/cpuinfo
d. Considerando que el programa realiza transferencias desde memoria, en base al tiempo de ejecución
obtenido y la cantidad de Bytes transferidos, ¿cuál sería la tasa de transferencia para lo encontrado en
los puntos a y b?
e. ¿Encuentra alguna relación entre los valores investigados sobre el CPU y la RAM y estas tasas de
transferencia calculadas? Advertencia: por cada ciclo del lazo, hay una transferencia de memoria, y
varias instrucciones de CPU, es decir que se introducen tiempos adicionales que quitan precisión al
cálculo. No espere encontrar coincidencias exactas en los valores.
7. Cree un programa que permita a un alumno ingresar las calificaciones de sus parciales y conocer
su estado académico en la materia Sistemas Operativos, según las condiciones publicadas en las
diapositivas de la primera clase.
6
Ejercicio_7.cpp