Está en la página 1de 3

Simulación Virtual N° 2

1. Al ejecutar el siguiente programa, el proceso no termina. Explica por qué.


Da una solución que no cambie el número de procesos que se generan.

int main (int argc, char ∗argv[ ])

{ int tubo[2]; pipe(tubo);

if (fork()==0) { if (fork()== 0)

dup2 (tubo[1], STDOUT FILENO);


close(tubo[0]); close(tubo[1]);
execlp("ls", "ls", NULL);

} else {

dup2 (tubo[0], STDIN FILENO);


close(tubo[0]); close(tubo[1]);
execlp("wc", "wc", "-l", NULL);

} else {

wait(NULL);

printf ("Fin del proceso\n");

Respuesta: El programa quiere realizar el sort de un fichero, pon ende hay que
colocar en primer lugar el contenido del fichero en una tubería. Aquí en este punto
el proceso puede pasar a un estado de bloqueo si llena la tubería y no saliendo de
este estado al no haber ningún proceso que lea de ella y esta quede vacía. Si la
tubería tuviese espacio para almacenar el fichero completo, la ejecución
continuaría y se mostraría el resultado al ejecutar la orden sort sobre el contenido
del fichero.

Su solución seria declarar los fork, incluir otras librerías, asociar quien será el
padre y quien será el hijo. Ejemplo de cómo compilaría:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
using namespace std;
int main (int argc, char *argv[]) {
int tubo[2];
pipe(tubo);
pid_t c_pid = fork();

if (c_pid == 0){

if (c_pid == 0)
{
// instrucciones que solo el proceso padre hará
dup2 (tubo[1], STDOUT_FILENO);
close(tubo[0]);
close(tubo[1]);
execlp("ls", "ls", NULL);
}
else
{
// instrucciones que solo el proceso hijo hará
dup2 (tubo[0], STDIN_FILENO);
close(tubo[0]);
close(tubo[1]);
execlp("wc", "wc", "-l", NULL);
}
}
else {
wait(NULL);
printf ("Fin del proceso\n");
}
}
2. Dados los siguientes procesos y sus respectivas secuencias de código, indica
si existiría o no situación de interbloqueo y explica por qué. En cualquier caso,
indica también la salida por pantalla y el valor final de los semáforos. Supón
que inicialmente todos los semáforos tienen valor cero.

Proceso 1 Proceso 2 Proceso 3


--------- --------- ---------
printf(“3”); sem_wait(&s1); sem_wait(&s2);
sem_post(&s3); printf(“1”); sem_wait(&s4);
printf(“4”); sem_wait(&s3); printf(“2”);
sem_post(&s2); sem_post(&s4); printf(“5”);
sem_post(&s3);
sem_post(&s1); sem_wait(&s3);

Respuesta: no hay situación de interbloqueo, todos los procesos se ejecutan y


acaban la secuencia de código, la salida por pantalla es 34125 y el valor final de
los cuatro semáforos están en cero

También podría gustarte