Actualizado el 26 de Octubre del 2020 (Publicado el 23 de Febrero del 2018)
1.305 visualizaciones desde el 23 de Febrero del 2018
801,9 KB
19 paginas
Creado hace 18a (17/10/2006)
Tema 2 : entorno programación linux
Sistemas Operativos:
Programación de Sistemas
Oscar Déniz Suárez
Alexis Quesada Arencibia
Francisco J. Santana Pérez
Curso 2006-07
Óscar Déniz / Alexis Quesada /
Francisco J. Santana
1
Programación C en UNIX
(cid:1) Repasen el lenguaje C y fundamentos de UNIX
(cid:1) asignatura Sistemas Operativos
(cid:1) No necesitamos usar C++, ni otros
refinamientos, pero si quieren pueden usar...
(cid:1) C++ sencillo
(cid:1) la librería ncurses
(cid:1) Deben dar preferencia al uso de llamadas al
sistema
Óscar Déniz / Alexis Quesada /
Francisco J. Santana
2
La función main
(cid:1) Función de entrada al programa C
int main(int argc, char *argv[]);
(cid:1) Una rutina especial de arranque es
llamada por el Kernel:
• La rutina es insertada en el ejecutable en el
proceso de linkado
• La rutina se encarga de tomar del Kernel los
parámetros y el entorno
• Y llama a la función main
Óscar Déniz / Alexis Quesada /
Francisco J. Santana
3
Manejo de errores
(cid:1) En caso de error: Las llamadas al sistema
devuelven -1 ó NULL (si la función devuelve
tipo puntero)
(cid:1) Deben siempre comprobar después de una
llamada si todo es correcto, para ello Linux
proporciona una variable errno y una función
perror():
Óscar Déniz / Alexis Quesada /
Francisco J. Santana
4
Manejo de errores
Ejemplo de programa, del uso de la variable global errno y del
procedimiento perror()
/* errores.c: lista los 53 primeros errores de llamadas al sistema */
# include <stdio.h>
main(argc,argv)
int argc;
char *argv[];
{
int i;
extern int errno;
for (i=0;i<=53;i++){
fprintf(stderr,"%3d",i);
errno=i;
perror(" ");
}
exit(0);
}
Óscar Déniz / Alexis Quesada /
Francisco J. Santana
5
Terminación de procesos
(cid:1) Un proceso puede terminar de 5 formas:
(cid:1) Normalmente:
• retornando de main (con return ó llegando al
final)
• llamando exit
• llamando _exit
(cid:1) Anormalmente:
• llamando abort
• terminado por una señal
Óscar Déniz / Alexis Quesada /
Francisco J. Santana
6
Terminación de procesos
(cid:1) _exit vuelve al kernel inmediatamente. Definida
por POSIX
#include <unistd.h>
void _exit(int status);
(cid:1) exit realiza antes cierto “limpiado” (p.ej.
terminar de escribir los buffers a disco). Es
ANSI C
#include <stdlib.h>
void exit(int status);
Óscar Déniz / Alexis Quesada /
Francisco J. Santana
7
Terminación de procesos
(cid:1) Las funciones exit y return pueden devolver un código de retorno
(cid:1) El shell puede utilizar el código de retorno:
% ls /
bin coda etc lib misc nfs proc sbin usr
boot dev home lost+found mnt opt root tmp var
% echo $?
0
% ls fichero_no_existente
ls: fichero_no_existente: No such file or directory
% echo $?
1
(cid:1) Código de retorno 0 = terminación correcta
Óscar Déniz / Alexis Quesada /
Francisco J. Santana
8
Terminación de procesos
(cid:1) Con ANSI C un proceso puede registrar
hasta 32 funciones que se llamarán
automáticamente por exit
(cid:1) La función atexit:
#include <stdlib.h>
int atexit(void (*func) (void));
Óscar Déniz / Alexis Quesada /
Francisco J. Santana
9
Argumentos de línea de comando
int main(int argc, char *argv[])
{
int i;
for (i=0; i<argc; i++)
printf(“argv[%d]: %s\n”, i, argv[i]);
exit(0);
}
Óscar Déniz / Alexis Quesada /
Francisco J. Santana
10
Variables de entorno
(cid:1) Además de los parámetros, a un programa que
comienza se le pasa la lista de variables de
entorno.
(cid:1) La lista es heredada del programa lanzador
(cid:1) Es un array de punteros a cadenas terminadas
en nulo (\0)
extern char **environ;
(cid:1) Las cadenas son de la forma variable=valor
Óscar Déniz / Alexis Quesada /
Francisco J. Santana
11
Variables de entorno
(cid:1) Probar env en la línea de comandos.
(cid:1) Podemos manimupar las variables de
entorno desde el shell con los comandos:
(cid:1) export PATH= …..
(cid:1) echo $PATH
Óscar Déniz / Alexis Quesada /
Francisco J. Santana
12
Variables de entorno
desde programas
#include <stdio.h>
/* The ENVIRON variable contains the environment. */
extern char** environ;
int main ()
{
char** var;
for (var = environ; *var != NULL; ++var)
printf (“%s\n”, *var);
return 0;
}
(cid:1) ANSI C define una función útil:
char *getenv(const char *name)
Óscar Déniz / Alexis Quesada /
Francisco J. Santana
13
Estructura en memoria de un programa C
Direcciones altas
parámetros y entorno
pila
heap
datos no inicializados
exec los pone a 0
datos inicializados
Direcciones bajas
código
Leídos de
disco por exec
Óscar Déniz / Alexis Quesada /
Francisco J. Santana
14
Codificación prudente: assert
(cid:1) assert(condición)
(cid:1) Para obviarlos se puede compilar
definiendo la macro NDEBUG (opción
–DNDEBUG del compilador)
Óscar Déniz / Alexis Quesada /
Francisco J. Santana
15
Fallos de las llamadas al sistema
(cid:1) Las llamadas al sistema podrán fallar por:
(cid:1) Argumentos de la llamada inválidos
(cid:1) Recursos agotados (p.ej. no hay memoria o disco
suficiente)
(cid:1) Acceso no permitido (p.ej. al intentar escribir un
fichero para el que no tenemos permiso)
(cid:1) Fallo hardware
(cid:1) Interrupción por una señal
Óscar Déniz / Alexis Quesada /
Francisco J. Santana
16
La librería ncurses
(cid:1) Trabaja con el concepto de ventana
(cid:1) Uso:
$ gcc curses_prog.c -o curses_prog –lcurses
(cid:1) Estructura general:
#include <curses.h>
main()
{
initscr();
/* cuerpo */
endwin();
exit(0);
}
Óscar Déniz / Alexis Quesada /
Francisco J. Santana
17
La librería ncurses
(cid:1) Facilidades para:
(cid:1) Escritura en una posición de pantalla
(cid:1) Colores, atributos
(cid:1) Líneas horizontales y verticales
(cid:1) Cajas
(cid:1) Scrolling
(cid:1) Manejo de Ratón
(cid:1) ...
Óscar Déniz / Alexis Quesada /
Francisco J. Santana
18
¿y a partir de ahora?
(cid:1) Haremos un recorrido por los servicios básicos
que proporciona el sistema operativo para:
(cid:1) Procesos
(cid:1) Señales
(cid:1) Comunicación y sincronización de procesos
(cid:1) Memoria
(cid:1) Entrada/salida, ficheros
(cid:1) Manejadores de dispositivos
Óscar Déniz / Alexis Quesada /
Francisco J. Santana
19
Comentarios de: Tema 2 - Programación básica en entorno UNIX (0)
No hay comentarios