benemérita universidad autónoma de...
TRANSCRIPT
Benemérita Universidad Autónoma de Puebla
Facultad de Ciencias de la Computación
Ingeniería en Ciencias de la Computación
Reporte de Practica No. 8
Unidad 4
Profesor: Ma. Carmen Cerón Garnica
Materia: Sistemas Operativos 2
Integrantes del equipo:
Ernesto Barrientos Tirso Matrícula: 201211174
Mauricio Oropeza Benítez Matrícula: 201229682
Iván Escalona Pérez Matrícula: 201450858
Sistemas Operativos II
INTRODUCCIÓN
Strace es una herramienta útil de diagnóstico, instrucción y depuración. Los
administradores del sistema, los diagnosticadores y los solucionadores de problemas lo
encontrarán invaluable para resolver problemas con programas para los cuales la fuente no
está disponible ya que no necesitan ser recompilados para rastrearlos. Los estudiantes, los
piratas informáticos y los extremadamente curiosos encontrarán que se puede aprender
mucho sobre un sistema y sus llamadas de sistema, rastreando incluso los programas
ordinarios. Y los programadores encontrarán que, dado que las llamadas y señales del
sistema son eventos que suceden en el interfaz usuario / kernel, un examen detallado de
este límite es muy útil para el aislamiento de errores, la comprobación de la cordura y el
intento de capturar las condiciones de carrera.
Cada línea en la traza contiene el nombre de la llamada del sistema, seguido de sus
argumentos entre paréntesis y su valor de retorno. Un ejemplo de poner el comando '' cat
/ dev / null '' es:
open ("/ dev / null", O_RDONLY) = 3
Los errores (generalmente un valor de retorno de -1) tienen el símbolo errno y la cadena de
error adjuntados.
open ("/ foo / bar", O_RDONLY) = -1 ENOENT (No existe ningún archivo o directorio)
Las señales se imprimen como un símbolo de señal y una cadena de señal. Un extracto de
la instrucción e interrupción del comando '' dormir 666 '' es:
sigsuspend ([] <inacabado ...>
--- SIGINT (Interrumpir) ---
+++ asesinado por SIGINT +++
Si se está ejecutando una llamada al sistema y, mientras tanto, se está convocando a otra
desde un proceso / subproceso diferente, entonces strace intentará conservar el orden de
esos eventos y marcará la llamada en curso como inacabada. Cuando la llamada regrese, se
marcará como reanudada.
Sistemas Operativos II
Metodología.
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#define TAM_MAX 32
int main(int argc, char **argv) {
struct termios term_atrib;
char linea[TAM_MAX];
/* Obtiene los atributos del terminal */
if (tcgetattr(0, &term_atrib)<0) {
perror("Error obteniendo atributos del terminal");
exit(1);
}
/* Desactiva el eco. Con TCSANOW el cambio sucede inmediatamente */
term_atrib.c_lflag &= ~ECHO;
tcsetattr(0, TCSANOW, &term_atrib);
printf ("Introduzca la contrasena: ");
/* Lee la linea y a continuacion la muestra en pantalla */
if (fgets(linea, TAM_MAX, stdin)) {
linea[strlen(linea)-1]='\0';
/* Eliminando fin de linea */
printf("\nHas escrito %s\n", linea); }
/* Reactiva el eco */
term_atrib.c_lflag |= ECHO; tcsetattr(0, TCSANOW, &term_atrib); exit(0);
//..Traza de llamadas al sistema mientras se ejecuta el programa anterior
strace ./a.out
execve("./a.out", ["./a.out"], [/* 31 vars */]) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE, {B38400 opost isig icanon echo ...}) = 0
ioctl(0, TCSETS, {B38400 opost isig icanon -echo ...}) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE, {B38400 opost isig icanon -echo ...}) = 0
write(1, "Introduzca contrasegna: ", 23Introduzca contrasegna: ) = 23
read(0, "secreto\n", 1024) = 8
write(1, "\n", 1) = 1
write(1, "has escrito secreto\n", 20) = 20
ioctl(0, TCSETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE, {B38400 opost isig icanon echo ...}) = 0
exit_group(0) = ?
Sistemas Operativos II
Sistemas Operativos II
Sistemas Operativos II
//Ejemplo de entrada/salida no bloqueante (asincrona)
#include <fcntl.h>
#include <errno.h>
#include <aio.h>
#include <stdio.h>
#include <strings.h>
int main() {
char buf[4096];
ssize_t nbytes;
int retval, n=0;
struct aiocb myaiocb;
bzero( &myaiocb, sizeof (struct aiocb));
/* rellena la estructura myaiocb */
myaiocb.aio_fildes = open("fifo", O_RDONLY);
myaiocb.aio_offset = 0;
myaiocb.aio_buf = (void *) buf;
myaiocb.aio_nbytes = sizeof (buf);
myaiocb.aio_sigevent.sigev_notify = SIGEV_NONE;
retval = aio_read( &myaiocb );
if (retval) perror("aio_read:");
/* continua el procesamiento */
//...
/* espera a que acabe */
while ( (retval=aio_error(&myaiocb) )== EINPROGRESS) {
fprintf(stderr, "%d ", n++);
sleep(1); }
/* libera aiocb */
nbytes = aio_return( &myaiocb);
printf("Total leido: %d bytes\n", nbytes);
return 0;
}