LLAMADAS AL SISTEMA
FERRERO, LUCRECIA
e-mail: lucrefer2@yahoo.com.ar
MNDOLA, SILVINA
e-mail: silvinamandola@gmail.com
Ferrero, Lucrecia
Mndola, Silvina
UTN-FRSF
TP2: llamadas al sistema
Ferrero, Lucrecia
Mndola, Silvina
UTN-FRSF
TP2: llamadas al sistema
<sys/types.h>
<unistd.h>
<stdio.h>
<string.h>
<stdlib.h>
<fcntl.h>
[-s nombre_archivo]\n");
Ferrero, Lucrecia
Mndola, Silvina
argc);
UTN-FRSF
TP2: llamadas al sistema
argv[0]);
printf("\n");
printf("%s%s", "argumento: 1 ", argv[1]);
printf("\n");
break;
case 's':
if ( argc == 2 )
{
printf("%s%s", argv[0], ": option
requires an argument --s \n");
printf("\n");
}
else
{
int fd = creat(argv[2], O_CREAT +
O_WRONLY);
write(fd, argv[0], 5);
write(fd, argv[1], 5);
}
break;
default: printf("%s", "uso: [-cl] [-s
nombre_archivo]\n");
}
}
}
if ( argc > 3 )
{
printf("%s", "uso: [-cl]
}
[-s nombre_archivo]\n");
return 0;
Ferrero, Lucrecia
Mndola, Silvina
UTN-FRSF
TP2: llamadas al sistema
GESTIN DE PROCESOS
EJERCICIO 2.
Genere un programa en C: ej2.c que mostrar a travs del
siguiente rbol de jerarqua de procesos, los diferentes
resultados para la variable VALOR:
rbol:
Nodo R (Raz): corresponde al proceso principal,
imprimir el valor inicial para la variable. Este valor ser
recibido como argumento por lnea de comando.
Nodo 1: es el primer hijo del proceso principal, que a su
vez ser raz del subrbol 1. Imprimir el incremento en
100 de la variable VALOR.
Ferrero, Lucrecia
Mndola, Silvina
UTN-FRSF
TP2: llamadas al sistema
ej2 nro
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
void
void
void
void
ChildProcessleft(int valor);
ChildProcessright(int valor);
Grandsonleft(int valor);
Grandsonright(int valor);
Ferrero, Lucrecia
Mndola, Silvina
UTN-FRSF
TP2: llamadas al sistema
}
else
{
ChildProcessright(valor);
}
return 0;
Ferrero, Lucrecia
Mndola, Silvina
UTN-FRSF
TP2: llamadas al sistema
EJERCICIO 3.
Deber generar un programa que calcula el factorial del
siguiente rango de numeracin: 1 a 10.
El programa se llamar factorial.c. Antes de finalizar y luego
de realizado el clculo en caso de que se haya recibido un
nmero valido, deber imprimir el nmero de su identificacin
de proceso. En caso de que no sea un nmero vlido mostrar
un mensaje de error y tambin deber imprimir el nmero de
ID.
Este programa (factorial) ser invocado desde ej3.c
reemplazndolo (ej3 ser sustituido por factorial). Antes de
invocar al programa factorial, ej3 deber mostrar su propio
nmero de identificacin de proceso. En caso de error se
deber indicar que factorial no ha podido ejecutarse.
Al finalizar la corrida, deber incluir en el archivo de texto de
resolucin del TP una breve conclusin sobre los nmeros de
procesos que fueron identificados.
Sintaxis de ejecucin (suponiendo que se lo compila con el
nombre ej3):
ej3 nmero
Ferrero, Lucrecia
Mndola, Silvina
UTN-FRSF
TP2: llamadas al sistema
factorial.c
#include
#include
#include
#include
<sys/types.h>
<unistd.h>
<fcntl.h>
<stdio.h>
Ferrero, Lucrecia
Mndola, Silvina
UTN-FRSF
TP2: llamadas al sistema
ej3.c.
#include
#include
#include
#include
<sys/types.h>
<unistd.h>
<fcntl.h>
<stdio.h>
10
Ferrero, Lucrecia
Mndola, Silvina
UTN-FRSF
TP2: llamadas al sistema
11
Ferrero, Lucrecia
Mndola, Silvina
UTN-FRSF
TP2: llamadas al sistema
#include <dirent.h>
void tipo (int argc, char *argv[]);
void directorios (int argc, char *argv[]);
void inodo (int argc, char *argv[]);
int main(int argc, char *argv[])
{
int parametro;
if ( argc == 1 )
{
printf("%s", "uso: [-lti] [nombre_directorio]\n");
}
if ( argc >= 1 && argc <= 3 )
{
while ((parametro = getopt (argc, argv, "lti:")) != -1)
{
switch (parametro)
{
case 'l':
directorios (argc, argv);
break;
case 't':
tipo (argc, argv);
break;
case 's':
inodo (argc, argv);
break;
}
}
}
else
{
printf("%s", "uso: [-lti] [nombre_directorio]\n");
}
}
void tipo (int argc, char *argv[])
{
static unsigned char tipoID[7] = {DT_BLK, DT_CHR, DT_DIR,
DT_FIFO, DT_LNK, DT_REG, DT_SOCK};
static char *tipoSTRs[7] = {"Dispositivo de bloques",
"Dispositivo de caracteres", "Directorio", "FIFO", "Enlace", "Archivo
Regular", "Socket Unix"};
DIR *pd; //ptro a fichero directorio
struct dirent *dirdatos; //info sobre 1 entrada en el directorio
if (argc == 1)
{
fprintf (stderr, "numero de parametro erroneo \n");
fprintf (stderr, "Uso %s <Directorio>\n", argv[0]);
exit(1);
}
pd = opendir(argv[2]);
if(pd == NULL)
{
perror(argv[2]);
exit(1);
}
dirdatos = readdir(pd);
12
Ferrero, Lucrecia
Mndola, Silvina
UTN-FRSF
TP2: llamadas al sistema
" ,tipoSTRs[4]);
dirdatos = readdir(pd);
case 5:
printf ("%s%s%s \n", dirdatos-> d_name, " dirdatos = readdir(pd);
case 6:
printf ("%s%s%s \n", dirdatos-> d_name, " -
" ,tipoSTRs[5]);
" ,tipoSTRs[6]);
dirdatos = readdir(pd);
case 7:
printf ("%s%s%s \n", dirdatos-> d_name, " dirdatos = readdir(pd);
}
if (dirdatos-> d_type & DT_REG)
{
printf ("%s%s \n", dirdatos-> d_name, " - Regular");
dirdatos = readdir(pd);
}
}
closedir (pd);
}
void directorios (int argc, char *argv[])
{
DIR *pd; //ptro a fichero directorio
struct dirent *dirdatos; //info sobre 1 entrada en el directorio
if (argc == 1)
{
13
Ferrero, Lucrecia
Mndola, Silvina
UTN-FRSF
TP2: llamadas al sistema
pd = opendir(argv[2]);
if(pd == NULL)
{
perror(argv[2]);
exit(1);
}
dirdatos = readdir(pd);
printf("%s%s", "Listado del directorio: ", argv[2]);
printf("\n");
while (dirdatos != NULL)
{
printf ("%s \n", dirdatos-> d_name);
dirdatos = readdir(pd);
}
closedir (pd);
GESTIN DE SEALES
EJERCICIO 5.
A los huspedes del hotel se les ofrece entre otros tantos
servicios, el desayuno buffete. Una de las principales
preferencias elegidas por los visitantes son las tostadas para
poder acompaar con una gran variedad de mermeladas
regionales de diferentes sabores.
14
Ferrero, Lucrecia
Mndola, Silvina
UTN-FRSF
TP2: llamadas al sistema
<sys/types.h>
<unistd.h>
<signal.h>
<stdio.h>
int tostadas = 0;
int lista = 1;
void tostar (int sig);
void man_alarm (int sig);
int main()
{
signal(SIGUSR1,
signal(SIGUSR2,
signal(SIGALRM,
while( tostadas
&tostar);
&tostar);
&man_alarm);
< 15 )
15
Ferrero, Lucrecia
Mndola, Silvina
UTN-FRSF
TP2: llamadas al sistema
{
if (lista) printf("Tostadora libre, esperando pan.\n");
pause();
}
return 0;
}
void man_alarm (int sig)
{
lista = 1;
printf ("Tostadas listas\n");
}
void tostar (int sig)
{
tostadas ++;
lista = 0;
switch (sig)
{
case SIGUSR1:
printf("\n");
printf("Deseo tostadas de pan blanco.\n");
printf("Tostada de pan blanco (%d) \n",
tostadas);
alarm(2);
break;
case SIGUSR2:
printf("\n");
printf("Deseo tostadas de pan negro.\n");
printf("Tostada de pan negro: (%d)\n",
tostadas);
alarm(1);
break;
./huesped [pid_tostadora]
#include
#include
#include
#include
#include
<sys/types.h>
<signal.h>
<stdio.h>
<unistd.h>
<stdlib.h>
16
Ferrero, Lucrecia
Mndola, Silvina
UTN-FRSF
TP2: llamadas al sistema
kill(pid_m, SIGUSR1);
}
else
{
printf("%s%d\n","Pedido de tostadas de pan
Negro. Huesped: ", i);
kill(pid_m, SIGUSR2);
}
Sleep(2);
}
return 0;
17
Ferrero, Lucrecia
Mndola, Silvina
UTN-FRSF
TP2: llamadas al sistema
<sys/types.h>
<unistd.h>
<fcntl.h>
<stdio.h>
int main(void)
{
int fd, newfd;
while ((getc(stdin) != -1 ))
{
char *c[50];
scanf("%[^\n]", c);
printf("%s%s\n", c, "_AR234");
}
return 0;
}
./checkin
#include
#include
#include
#include
<sys/types.h>
<unistd.h>
<fcntl.h>
<stdio.h>
int main(void)
{
int asiento = 1;
char linea[50] = getline(stdin, 50);
printf("%s\n", linea);
while (getc(stdin) != -1 )
{
char *c[50];
scanf("%[^\n]\n", c);
printf("%s%s%d\n", c, "_", asiento);
asiento ++;
}
return 0;
}
./plandevuelo rc plandevuelo.txt
18
Ferrero, Lucrecia
Mndola, Silvina
#include
#include
#include
#include
#include
#include
UTN-FRSF
TP2: llamadas al sistema
<stdio.h>
<stdlib.h>
<unistd.h>
<sys/types.h>
<string.h>
<fcntl.h>
Ferrero, Lucrecia
Mndola, Silvina
UTN-FRSF
TP2: llamadas al sistema
20
Ferrero, Lucrecia
Mndola, Silvina
UTN-FRSF
TP2: llamadas al sistema
int tuberia[2];
pipe (tuberia);
pid = fork();
if (pid==0) //hijo
{
pid_t pid2;
int fd = creat("reservas.txt", O_CREAT + O_WRONLY); // crea
el archivo plandevuelo.txt
dup(tuberia[0]); //conecto la entrada estandar al archivo
close(1); // cierra la salida estandar
dup(fd); // ponemos el file descriptor en la salida
estandar
execve("./reservas", archivo, NULL);
}
else //padre
{
char linea [150];
fl = fopen ("pasajeros.txt", "r"); // abrimos el archivo de
pasajeros
close(1);//cierra salida estandar
dup(tuberia[1]);// pone el file descriptor en la entrada
estandar.
fl = fopen ("reservas.txt", "r"); // abrimos el archivo de
pasajeros
dup(tuberia[1]); // pone el file descriptor en la salida
estandar.
execve("./checkin", archivo, NULL);
}
}
21
Ferrero, Lucrecia
Mndola, Silvina
UTN-FRSF
TP2: llamadas al sistema
Ferrero, Lucrecia
Mndola, Silvina
UTN-FRSF
TP2: llamadas al sistema
CONCLUSION EJERCICIO 3:
Es que el ID del Proceso que invoca y el ID del Prg-Factorial
son iguales, lo que significa que al llamar a execve, no cambia
de proceso sino que se sigue ejecutando el mismo.
Fuentes desde donde nos guiamos para la sintaxis de
algunas funciones:
http://www.forosdelweb.com/f96/mostrar-directorios-contenido-ficherostxt-765146/
http://totaki.com/poesiabinaria/2011/09/listar-archivos-dentro-de-undirectorio-o-carpeta-en-c/
Ejercicio 6:
Realizamos la codificacin de los 3 programas: reservas.c,
checkin.c y plandevuelo.c.
reservas.c y checkin.c funcionan correctamente en
plandevuelo.c. Hemos dedicado tiempo investigando,
realizando consultas y pruebas, pero no logramos que
funcione con la opcin -rc. Sin embargo dejamos expuesta
su codificacin en la imagen (.img) y en este documento.
23