El documento presenta el código C para implementar una mini shell con diferentes comandos como procesos en abanico, uso de semaforos, creación y copia de archivos, uso de lseek en vectores, comando tail, pipes y tuberías, obtención de la hora del sistema, y medición del tiempo en modo usuario. El código incluye funciones para analizar la entrada del usuario, parsear argumentos, manejar background processes y pipes/tuberías entre procesos.
aqui estoy explicando un poco como son las estructuras de control de la Programacion orientada a objeto if-else, for, while,do-while,switch-case,exception
aqui estoy explicando un poco como son las estructuras de control de la Programacion orientada a objeto if-else, for, while,do-while,switch-case,exception
Catedral y bazar una visión analítica de la técnica de desarrollo open source Alex Pin
analisis de las virtudes que puede tener el diseñar una aplicación o servicio bajo la metodología del bazar, donde todos colaboran para mejorar el producto
Es un diagrama para La asistencia técnica o apoyo técnico es brindada por las compañías para que sus clientes puedan hacer uso de sus productos o servicios de la manera en que fueron puestos a la venta.
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informáticavazquezgarciajesusma
En este proyecto de investigación nos adentraremos en el fascinante mundo de la intersección entre el arte y los medios de comunicación en el campo de la informática.
La rápida evolución de la tecnología ha llevado a una fusión cada vez más estrecha entre el arte y los medios digitales, generando nuevas formas de expresión y comunicación.
Continuando con el desarrollo de nuestro proyecto haremos uso del método inductivo porque organizamos nuestra investigación a la particular a lo general. El diseño metodológico del trabajo es no experimental y transversal ya que no existe manipulación deliberada de las variables ni de la situación, si no que se observa los fundamental y como se dan en su contestó natural para después analizarlos.
El diseño es transversal porque los datos se recolectan en un solo momento y su propósito es describir variables y analizar su interrelación, solo se desea saber la incidencia y el valor de uno o más variables, el diseño será descriptivo porque se requiere establecer relación entre dos o más de estás.
Mediante una encuesta recopilamos la información de este proyecto los alumnos tengan conocimiento de la evolución del arte y los medios de comunicación en la información y su importancia para la institución.
Actualmente, y debido al desarrollo tecnológico de campos como la informática y la electrónica, la mayoría de las bases de datos están en formato digital, siendo este un componente electrónico, por tanto se ha desarrollado y se ofrece un amplio rango de soluciones al problema del almacenamiento de datos.
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...Telefónica
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0xWord escrito por Ibón Reinoso ( https://mypublicinbox.com/IBhone ) con Prólogo de Chema Alonso ( https://mypublicinbox.com/ChemaAlonso ). Puedes comprarlo aquí: https://0xword.com/es/libros/233-big-data-tecnologias-para-arquitecturas-data-centric.html
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informáticavazquezgarciajesusma
En este proyecto de investigación nos adentraremos en el fascinante mundo de la intersección entre el arte y los medios de comunicación en el campo de la informática.
La rápida evolución de la tecnología ha llevado a una fusión cada vez más estrecha entre el arte y los medios digitales, generando nuevas formas de expresión y comunicación.
Continuando con el desarrollo de nuestro proyecto haremos uso del método inductivo porque organizamos nuestra investigación a la particular a lo general. El diseño metodológico del trabajo es no experimental y transversal ya que no existe manipulación deliberada de las variables ni de la situación, si no que se observa los fundamental y como se dan en su contestó natural para después analizarlos.
El diseño es transversal porque los datos se recolectan en un solo momento y su propósito es describir variables y analizar su interrelación, solo se desea saber la incidencia y el valor de uno o más variables, el diseño será descriptivo porque se requiere establecer relación entre dos o más de estás.
Mediante una encuesta recopilamos la información de este proyecto los alumnos tengan conocimiento de la evolución del arte y los medios de comunicación en la información y su importancia para la institución.
Inteligencia Artificial y Ciberseguridad.pdfEmilio Casbas
Recopilación de los puntos más interesantes de diversas presentaciones, desde los visionarios conceptos de Alan Turing, pasando por la paradoja de Hans Moravec y la descripcion de Singularidad de Max Tegmark, hasta los innovadores avances de ChatGPT, y de cómo la IA está transformando la seguridad digital y protegiendo nuestras vidas.
1. ESCUELA POLITÉCNICA NACIONAL
CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN
SISTEMAS OPERATIVOS
NOMBRE: Alexander Pinchao
INFORME
Programa para una mini Shell
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
#include<sys/mman.h>
#include<pthread.h>
#include<semaphore.h>
#include<sys/file.h>
#include<time.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<sys/times.h>
#include<sys/time.h>
#include<unistd.h>
externint fork();
externint pipe();
/* Define constante nominada*/
#define PROMPT "veroshell@vero-linux:$ "
#define ESPACIO ' '
#define TUBERIA '|'
#define ENTRADA '<'
#define SALIDA '>'
#define ERROR "&>"
#define VARIABLE '='
#define EXIT 'e'
#define INGRESO 'i'
#define DOLAR '$'
#define BACKGROUND '&'
#define MAX_BUF 1024
#define MAX_COMMS 32
#define MAX_ARGS 32
#define TAMANYO_ALM 1024
#define TB 1024
#define ESPERA 1000
char buf[TB];
char *bp;
int lver=0, larchivo=1, i, lineas=0, desplazamiento=0;
int archivo,bytesleidos;
int arrange (char *buffer) {
int i = 0, j = 0;
while (buffer[i]) {
2. ESCUELA POLITÉCNICA NACIONAL
CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN
SISTEMAS OPERATIVOS
NOMBRE: Alexander Pinchao
while (buffer[i] == ESPACIO) i++;
while ((buffer[i] != ESPACIO) && buffer[i])
buffer[j++] = buffer[i++];
if (! buffer[i]) {
if (buffer[i-2] == ESPACIO)
buffer[j-2] = '0';
else buffer[j-1] = '0';
}
else
buffer[j++] = ESPACIO;
}
return j;
}
int makeargs (char * buffer, char * args[]) {
int i = 0;
char * puntero = buffer;
args[i++] = puntero;
while (puntero = strchr(puntero, ESPACIO)) {
*puntero++ = '0';
args[i++] = puntero;
}
args[i] = NULL;
return i;
}
int environment (char * buffer, char * env[]) {
char *puntero = buffer;
if (puntero = strchr(puntero, INGRESO)) {
*puntero++ = '0';
env[0] = buffer;
env[1] = puntero;
return 1;
}
return 0;
}
int background (char * buffer) {
char *puntero = buffer;
if (puntero = strchr(puntero, BACKGROUND)) {
*puntero--;
*puntero = '0';
return 1;
}
return 0;
}
int main( int argc, char *argv[] ) {
int continuar;
int ingreso;
#ifdef DEBUG
int i;
#endif
char buffer[MAX_BUF], *puntero, value[MAX_BUF], *args[MAX_ARGS],
*comms[MAX_COMMS];
int j = 0, k = 0, pid = 0, numargs = 0, actual = 0, anterior = 0, t1[2],
t2[2];
printf("nMinishell de sistemas Operativos");
printf("nn");
3. ESCUELA POLITÉCNICA NACIONAL
CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN
SISTEMAS OPERATIVOS
NOMBRE: Alexander Pinchao
do{
printf(PROMPT);
printf("n MENU");
printf("n 1. Procesos en abanico");
printf("n 2. Semaforos");
printf("n 3. Creacion de archivos");
printf("n 4. Copia de un archivo a otro");
printf("n 5. Vector usando lseek");
printf("n 6. Comando tail");
printf("n 7. Pipes");
printf("n 8. Tuberias");
printf("n 9. Hora del sistema");
printf("n 10. Tiempo en modo usuario");
printf("n 11. Comandos");
printf("n Ingrese la opcion a realizar: ");
scanf("%i",&ingreso);
if(ingreso==11){
while(1) {
printf(PROMPT);
if (fgets(buffer, MAX_BUF, stdin) == NULL)
continue;
arrange(buffer);
#ifdef DEBUG
printf("Entrada: #%s#n", buffer);
i = 0;
#endif
if (environment(buffer, args)) {
//setenv(args[0], args[1], 1); =
exit(0);
}
elseif (background(buffer)) {
if (fork() == 0) {
pid = fork();
if (pid) {
wait(NULL);
printf("Proceso terminado con PID=%dn", pid);
printf(PROMPT);
exit(0);
}
else {
execlp(buffer, buffer, NULL);
perror("Error de ejecucion de execvpn");
exit(0);
}
}
}
elseif (fork()) wait(NULL);
else {
numargs = makeargs(buffer, args);
while (args[j] != NULL) {
#ifdef DEBUG
printf(" #%s#n", args[j]);
#endif
4. ESCUELA POLITÉCNICA NACIONAL
CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN
SISTEMAS OPERATIVOS
NOMBRE: Alexander Pinchao
if (args[j][0] == DOLAR) {
strcpy(value, getenv(++args[j]));
args[j] = value;
}
if (*args[j] == '|') {
args[j] = NULL;
anterior = actual;
actual = j+1;
pipe(t1);
#ifdef DEBUG
printf("t1[0] = %d, t1[1] = %dn", t1[0], t1[1]);
printf("t2[0] = %d, t2[1] = %dn", t2[0], t2[1]);
printf("Anterior %dn", anterior);
printf("Actual %dn", actual);
#endif
if (fork() == 0) {
if (anterior != 0) {
close(t1[0]); close(t2[1]);
close(0); dup(t2[0]);
close(1); dup(t1[1]);
close(t1[1]); close(t2[0]);
}
else {
close(t1[0]);
close(1); dup(t1[1]);
close(t1[1]);
}
execvp(args[anterior], &args[anterior]);
perror("Error de execvpn");
exit(0);
}
else wait(NULL);
t2[0] = t1[0];
t2[1] = t1[1];
}
j++;
}
#ifdef DEBUG
printf("t1[0] = %d, t1[1] = %dn", t1[0], t1[1]);
printf("t2[0] = %d, t2[1] = %dn", t2[0], t2[1]);
#endif
close(t2[1]);
close(0); dup(t2[0]);
close(t2[0]);
#ifdef DEBUG
printf("actual %dn", actual);
#endif
execvp(args[actual], &args[actual]);
perror("Error de execvpn");
exit(0);
}
}
}
elseif(ingreso==1){
pid_t pid;
int i;
5. ESCUELA POLITÉCNICA NACIONAL
CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN
SISTEMAS OPERATIVOS
NOMBRE: Alexander Pinchao
int n = 4;
printf ("nA partir de un proceso padre se crea un abanico de
procesosn");
for (i = 0; i < n; i++)
{
pid = fork();
if (pid == 0)
break;
}
printf("El padre del proceso %d es %dn", getpid(), getppid());
exit(0);
}
elseif(ingreso==2){
int pid_p; /* identifica el proceso hijo */
int mutex; /* semaforo binario */
mutex=inicia(1);
if (0==(pid_p=fork()))
proceso_hijo(mutex);
else
proceso_padre(mutex);
borra_s(mutex);
}
elseif(ingreso==3){
int fd_archivo;
int escrito=0;
int aux=0;
int longitud=5;
char datos[]="Prueba";
fd_archivo=creat("Ejemplo",0644);
if(fd_archivo==-1)
{
perror("Archivo no creado");
}
else
printf("Archivo creado");
while(escrito<longitud)
{
aux=write(fd_archivo, datos+escrito, longitud-escrito);
if(aux>0)
escrito=escrito+aux;
}
close(fd_archivo);
}
elseif(ingreso==4){
int fd_ent, fd_sal; /* identificadores de archivos */
char almacen[TAMANYO_ALM]; /* almacen de E/S */
int n_read; /* contador de E/S */
/* Abrir el archivo de entrada */
fd_ent = open ("Ejemplo", O_RDONLY);
if (fd_ent < 0)
6. ESCUELA POLITÉCNICA NACIONAL
CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN
SISTEMAS OPERATIVOS
NOMBRE: Alexander Pinchao
{
perror ("open");
exit (-1);
}
/* Crear el archivo de salida. Modo de protección: rw-r--r--*/
fd_sal = creat ("archivo_salida", 0644);
if (fd_sal < 0)
{
perror ("creat");
exit (-1);
}
/* Bucle de lectura y escritura */
while ((n_read = read (fd_ent, almacen, TAMANYO_ALM)) >0 )
{
if (write (fd_sal, almacen, n_read) < n_read)
{
perror ("write");
close (fd_ent);
close (fd_sal);
exit (-1);
}
}
if (n_read < 0)
{
perror ("read");
close (fd_ent);
close (fd_sal);
exit (-1);
}
printf("El archivo copiado correctamente en archivo_salida");
close (fd_ent);
close (fd_sal);
}
elseif(ingreso==5){
int fd_archivo;
int numero;
int longitud=10;
char datos1[]="ABCDEFGHIJ";
char datos2[]="abcdefghij";
fd_archivo=creat("Vectores",0644);
if(fd_archivo==-1)
{
perror("No se Puede Crear el Archivo");
}
write(fd_archivo, datos1, longitud);
numero= lseek(fd_archivo, 1024,SEEK_SET);
write(fd_archivo, datos2, longitud);
numero=lseek(fd_archivo, numero+1024,SEEK_SET);
write(fd_archivo, datos1, longitud);
printf("Archivo escrito con los vectores correctamente");
close(fd_archivo);
7. ESCUELA POLITÉCNICA NACIONAL
CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN
SISTEMAS OPERATIVOS
NOMBRE: Alexander Pinchao
}
elseif(ingreso==6){
archivo=open("Leer", O_RDONLY);
while(bytesleidos = read(archivo, buf, TB))//Cuento cuantas lineas
tiene mi archivo
{
for(i=0; i<= 1024; i++)
{
if(buf[i] == 'n')
larchivo++;
}
if(bytesleidos == -1)
break;
}
close(archivo);
printf ("nComando tailn nn");
printf("lineas para ver:");
scanf("%d",&lver);
if(lver >= larchivo)
lver = 0;
else{
while(bytesleidos = read(archivo,buf, 1024))
{
for(i=0; i <= 1024; i++)
{
if(buf[i] != 'n')
desplazamiento++;
else{
desplazamiento++;
lineas++;
}
if(lineas == larchivo - lver - 1)
break;
}
if(bytesleidos == -1)
break;
}
close(archivo);
}
archivo = open("Leer", O_RDONLY);
lseek(archivo, desplazamiento, SEEK_SET);
while(bytesleidos = read(archivo, buf, TB))
{
if(bytesleidos == -1)
break;
write(0, buf, bytesleidos);
}
close(archivo);
printf("n");
}
elseif(ingreso==7){
int fd[2];
char mensaje[] = "nMensaje enviado a hijo por Veron";
8. ESCUELA POLITÉCNICA NACIONAL
CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN
SISTEMAS OPERATIVOS
NOMBRE: Alexander Pinchao
char buffer[40];
pipe(fd);
pid_t hijo;
if((hijo = fork())<0)
{
perror("No se puede crear el proceson");
exit(1);
}
if(hijo!= 0)
{
close(fd[0]);
write(fd[1],mensaje,strlen(mensaje));
}
else
{
close(fd[1]);
read(fd[0],buffer,sizeof(buffer));
printf("nLo que se envio por el pipe es: %s",buffer);
}
return(0);
}
elseif(ingreso==8){
int fd1[2];
pid_t pid;
/* se crea la tuberia */
if (pipe(fd1) < 0) {
perror("Error al crear la tuberia");
exit(0);
}
pid = fork();
switch (pid) {
case -1: /* error */
perror("Error en el fork");
exit(0);
case 0: /* proceso hijo ejecuta ls */
close(fd1[0]);
close(STDOUT_FILENO);
dup(fd1[1]);
close(fd1[1]);
execlp("ls", "ls", NULL);
perror("Error en el exec");
break;
default: /* proceso padre ejecuta wc */
close(fd1[1]);
close(STDIN_FILENO);
dup(fd1[0]);
close(fd1[0]);
execlp("wc", "wc", NULL);
perror("Error en el exec");
}
}
elseif(ingreso==9){
time_t tiempo;
struct tm *fecha;
9. ESCUELA POLITÉCNICA NACIONAL
CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN
SISTEMAS OPERATIVOS
NOMBRE: Alexander Pinchao
tiempo= time(NULL);
fecha= localtime(&tiempo);
/* hay que ajustar el año ya que lo devuelve respecto a 1900 */
printf ("%02d/%02d/%04d %02d:%02d:%02dn",
fecha->tm_mday, fecha->tm_mon,
fecha->tm_year+1900, fecha->tm_hour,
fecha->tm_min, fecha->tm_sec);
}
elseif (ingreso==10){
struct tms InfoInicio, InfoFin;
clock_t t_inicio, t_fin;
long tickporseg;
if (argc<2) {
fprintf(stderr, "Uso: %s programa [args]n", argv[0]);
exit(1);
}
tickporseg= sysconf(_SC_CLK_TCK);
t_inicio= times(&InfoInicio);
if (fork()==0) {
execvp(argv[1], &argv[1]);
perror("error ejecutando el programa");
exit(1);
}
wait(NULL);
t_fin= times(&InfoFin);
printf ("Tiempo real: %7.2fn",
(float)(t_fin - t_inicio)/tickporseg);
printf ("Tiempo de usuario: %7.2fn",
(float)(InfoFin.tms_cutime -
InfoInicio.tms_cutime)/tickporseg);
printf ("Tiempo de sistema: %7.2fn",
(float)(InfoFin.tms_cstime -
InfoInicio.tms_cstime)/tickporseg);
}
printf("n Desea continuar: 1 0n");
scanf("%d", &continuar);
}//do
while(continuar==1);
}
proceso_hijo(critica)
int critica;
{
int i,j;
for (i=0;i< 5; i++)
{
P(critica);
printf("Soy el proceso Hijo en el turno %d", i);
10. ESCUELA POLITÉCNICA NACIONAL
CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN
SISTEMAS OPERATIVOS
NOMBRE: Alexander Pinchao
fflush(stdout); //Limpia el buffer de teclado
retardo ();
printf("n");
V(critica);
}
exit(1);
}
proceso_padre(critica)
int critica;
{
int i,j;
for (i=0;i< 5; i++)
{
P(critica);
printf("Soy el proceso Padre en el turno %d", i);
fflush (stdout); //Limpia el buffer de teclado
retardo ();
printf("n");
V(critica);
}
wait(0); /* espera a que finalice el hijo */
}
retardo()
{
struct timeval tiempo;
struct timezone tz;
unsignedlong inicio, ahora;
gettimeofday(&tiempo, &tz);
ahora = inicio = tiempo.tv_sec * 1000000 + tiempo.tv_usec;
// ESPERA microsegs
while (ahora < inicio + ESPERA)
{
gettimeofday(&tiempo, &tz);
ahora = tiempo.tv_sec * 1000000 + tiempo.tv_usec;
}
}
inicia(valor)
int valor;
{
int semval;
int id;
union semun
{
int val;
struct semid_ds *buf;
ushort *array;
} arg;
//Permisos del semaforo creado
if ((id=semget(IPC_PRIVATE, 1, (IPC_CREAT|0666))) == -1)
{
11. ESCUELA POLITÉCNICA NACIONAL
CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN
SISTEMAS OPERATIVOS
NOMBRE: Alexander Pinchao
perror("Error al crear semaforo.");
return(-1);
}
arg.val = valor;
if (semctl(id, 0, SETVAL, arg) == -1)
{
perror("Error al inicializar semaforo.");
return (-1); /*error en inicializacion*/
}
return(id);
}
/*Rutina P */
P(semaforo)
int semaforo;
{
if ( semcall(semaforo, -1) == -1 )
perror("Error");
}
/*Rutina V */
V(semaforo)
int semaforo;
{
if ( semcall(semaforo, 1) == -1 )
perror("Error");
}
semcall(semaforo, operacion)
int semaforo, operacion;
{
struct sembuf sb;
sb.sem_num = 0;
sb.sem_op = operacion;
sb.sem_flg = 0;
return ( semop(semaforo, &sb, 1) ); /*devuelve -1 si error */
}
borra_s(semaforo)
int semaforo;
{
if ( semctl(semaforo, 0, IPC_RMID, 0) == -1)
{
perror("Error");
return(-1);
}
}
CAPTURAS: