Clase10: lenguaje C: procesos (v1c)

62
ARCOS @ UC3M Alejandro Calderón Mateos Sistemas Operativos sesión 10: procesos Grado en Ingeniería Informática Universidad Carlos III de Madrid

Transcript of Clase10: lenguaje C: procesos (v1c)

Page 1: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Sistemas Operativossesión 10: procesos

Grado en Ingeniería Informática

Universidad Carlos III de Madrid

Page 2: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Agenda

Linux EjerciciosServicios para procesos

2

Page 3: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Agenda

Linux EjerciciosServicios para procesos

3

Page 4: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Contenidos

• Control de trabajos

• Control de procesos

• Compresión y descompresión

4

Page 5: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Contenidos

• Control de trabajos

• Control de procesos

• Compresión y descompresión

5

Page 6: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Motivación

• Trabajos = aplicaciones ejecutadas en un intérprete de mandatos

• ¿Cómo puedo gestionarlos?

acaldero@phoenix:~/work$ sleep 25 &acaldero@phoenix:~/work$ jobs

6

Page 7: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

sleep <número de segundos>

7

Page 8: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Control de trabajosejecución en primer/segundo plano

Ejecutando en

primer plano

Ejecutando en

segundo plano

8

Page 9: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Control de trabajosde ejecución en primer plano a congelación

ctrl-z

fg

Ejecutando en

primer plano

Ejecutando en

segundo plano

Congelada la

ejecución

9

Page 10: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Control de trabajosde congelado a ejecución en segundo plano

ctrl-z

fg

Ejecutando en

primer plano

Ejecutando en

segundo plano

Congelada la

ejecución

10

Page 11: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Control de trabajoslistado de trabajos

ctrl-z

fg

Ejecutando en

primer plano

Ejecutando en

segundo plano

Congelada la

ejecución

jobs

%<id>

11

Page 12: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Control de trabajosfinalización ejecutando en primer plano

ctrl-z

fg

Ejecutando en

primer plano

Ejecutando en

segundo plano

Congelada la

ejecución

jobs

%<id>

Provocar

fin ejecución

ctrl-c

12

Page 13: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Control de trabajosfinalización trabajo congelado

ctrl-z

fg

Ejecutando en

primer plano

Ejecutando en

segundo plano

Congelada la

ejecución

jobs

%<id>

Provocar

fin ejecución

ctrl-c

kill -9 %<id>

13

Page 14: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Control de trabajosfinalización ejecutando en segundo plano

ctrl-z

fg

Ejecutando en

primer plano

Ejecutando en

segundo plano

Congelada la

ejecución

jobs

%<id>

Provocar

fin ejecución

ctrl-c

kill -9 %<id>

jobs

14

Page 15: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Control de trabajos

ctrl-z

fg

Ejecutando en

primer plano

Ejecutando en

segundo plano

Congelada la

ejecución

jobs

%<id>

Provocar

fin ejecución

ctrl-c

kill -9 %<id>

jobs

15

Page 16: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Contenidos

• Control de trabajos

• Control de procesos

• Compresión y descompresión

16

Page 17: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Motivación

• ¿Cómo puedo gestionar los programasque están siendo ejecutados desdeotra sesión de intérprete de mandatos?

acaldero@phoenix:~/work$ ps axuacaldero@phoenix:~/work$ kill -1 1

17

Page 18: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Control de procesos

ctrl-z

Ejecutando en

primer plano

Ejecutando en

segundo plano

Congelada la

ejecución

ps axu

Provocar

fin ejecución

ctrl-c

kill -9 <pid>

ps axu

fg

18

Page 19: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Contenidos

• Control de trabajos

• Control de procesos

• Compresión y descompresión

19

Page 20: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Comprimir, descomprimir y listar

Extensión Comprimir Descomprimir Listar

zip .zip zip –r f.zip <ficheros> zip –a f.zip unzip –l f.zip

Tar +gzip

.tgz.tar.gz

tar zcvf f.tgz <ficheros> tar zxvf f.tgz tar ztvf f.tgz

Tar +bzip2

.tbz2.tar.bz2

tar jcf f.tbz2 <ficheros> tar jxf f.tbz2 tar jtvf f.tbz2

rar .rar rar a f.rar <ficheros> rar x f.rar rar l f.rar

20

Page 21: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Agenda

Linux EjerciciosServicios para procesos

21

Page 22: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Contenidos

• fork+exec+exit simple

• fork+exec+exit múltiple

22

Page 23: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Contenidos

• fork+exec+exit simple

• fork+exec+exit múltiple

23

Page 24: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Repasofork() + exec()

24

/* ejecutar el mandato ls -l */

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid == 0)

{execlp("ls","ls","-l",NULL);exit(-1);

} else

{while (pid != wait(&status));

}

exit(0);

}

Page 25: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Repasofork() + exec()

25

/* ejecutar el mandato ls -l */

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid == 0)

{execlp("ls","ls","-l",NULL);exit(-1);

} else

{while (pid != wait(&status));

}

exit(0);

}

Page 26: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Repasofork() + exec()

26

/* ejecutar el mandato ls -l */

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid == 0)

{execlp("ls","ls","-l",NULL);exit(-1);

} else

{while (pid != wait(&status));

}

exit(0);

}

/* ejecutar el mandato ls -l */

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid == 0)

{execlp("ls","ls","-l",NULL);exit(-1);

} else

{while (pid != wait(&status));

}

exit(0);

}

Page 27: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Repasofork() + exec()

27

/* ejecutar el mandato ls -l */

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid == 0)

{execlp("ls","ls","-l",NULL);exit(-1);

} else

{while (pid != wait(&status));

}

exit(0);

}

/* ejecutar el mandato ls -l */

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid == 0)

{execlp("ls","ls","-l",NULL);exit(-1);

} else

{while (pid != wait(&status));

}

exit(0);

}

Page 28: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Repasofork() + exec()

28

/* ejecutar el mandato ls -l */

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid == 0)

{execlp("ls","ls","-l",NULL);exit(-1);

} else

{while (pid != wait(&status));

}

exit(0);

}

/* ejecutar el mandato ls -l */

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid == 0)

{execlp("ls","ls","-l",NULL);exit(-1);

} else

{while (pid != wait(&status));

}

exit(0);

}

Page 29: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Repasofork() + exec()

29

/* ejecutar el mandato ls -l */

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid == 0)

{execlp("ls","ls","-l",NULL);exit(-1);

} else

{while (pid != wait(&status));

}

exit(0);

}

/* ejecutar el mandato ls -l */

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid == 0)

{execlp("ls","ls","-l",NULL);exit(-1);

} else

{while (pid != wait(&status));

}

exit(0);

}

Page 30: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Repasofork() + exec()

30

/* ejecutar el mandato ls -l */

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid == 0)

{execlp("ls","ls","-l",NULL);exit(-1);

} else

{while (pid != wait(&status));

}

exit(0);

}

/* ejecutar el mandato ls -l */

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid == 0)

{execlp("ls","ls","-l",NULL);exit(-1);

} else

{while (pid != wait(&status));

}

exit(0);

}

Page 31: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Repasofork() + exec()

31

/* ejecutar el mandato ls -l */

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid == 0)

{execlp("ls","ls","-l",NULL);exit(-1);

} else

{while (pid != wait(&status));

}

exit(0);

}

/* código del mandato ls */

#include <sys/types.h>

#include <stdio.h>

main() {

/* código del ls */

exit( 0 );}

Page 32: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Repasowait() + exit()

32

/* ejecutar el mandato ls -l */

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid == 0)

{execlp("ls","ls","-l",NULL);exit(-1);

} else

{while (pid != wait(&status));

}

exit(0);

}

/* código del mandato ls */

#include <sys/types.h>

#include <stdio.h>

main() {

/* código del ls */

exit( 0 );}

Page 33: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Repasowait() + exit()

33

/* ejecutar el mandato ls -l */

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid == 0)

{execlp("ls","ls","-l",NULL);exit(-1);

} else

{while (pid != wait(&status));

}

exit(0);

}

/* código del mandato ls */

#include <sys/types.h>

#include <stdio.h>

main() {

/* código del ls */

exit( 0 );}

Page 34: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Repasowait() + exit()

34

/* ejecutar el mandato ls -l */

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid == 0)

{execlp("ls","ls","-l",NULL);exit(-1);

} else

{while (pid != wait(&status));

}

exit(0);

}

/* código del mandato ls */

#include <sys/types.h>

#include <stdio.h>

main() {

/* código del ls */

exit( 0 );}

Page 35: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Repasowait() + exit()

35

/* ejecutar el mandato ls -l */

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid == 0)

{execlp("ls","ls","-l",NULL);exit(-1);

} else

{while (pid != wait(&status));

}

exit(0);

}

0

Page 36: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Repasowait() + exit()

36

/* ejecutar el mandato ls -l */

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid == 0)

{execlp("ls","ls","-l",NULL);exit(-1);

} else

{while (pid != wait(&status));

}

exit(0);

}

Page 37: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Repasowait() + exit()

37

Page 38: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Contenidos

• fork+exec+exit simple

• fork+exec+exit múltiple

38

Page 39: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Repasomúltiples procesos (bloqueante)

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid != 0) {

while (pid != wait(&status));

} else{

/* hacer algo */

exit(3);

}

pid = fork();if (pid != 0) {

while (pid != wait(&status));

} else{

/* hacer algo */

exit(3);

}

}

39

Page 40: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Repasomúltiples procesos (bloqueante)

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid != 0) {

while (pid != wait(&status));

} else{

/* hacer algo */

exit(3);

}

pid = fork();if (pid != 0) {

while (pid != wait(&status));

} else{

/* hacer algo */

exit(3);

}

}

40

Page 41: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid == 0) {

/* hacer algo */

exit(3);

} else{while (pid != wait(&status));

}

pid = fork();if (pid == 0) {

/* hacer algo */

exit(3);

} else{while (pid != wait(&status));

}

}

Repasomúltiples procesos (bloqueante)

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid != 0) {

while (pid != wait(&status));

} else{

/* hacer algo */

exit(3);

}

pid = fork();if (pid != 0) {

while (pid != wait(&status));

} else{

/* hacer algo */

exit(3);

}

}

41

Page 42: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid == 0) {

/* hacer algo */

exit(3);

} else{while (pid != wait(&status));

}

pid = fork();if (pid == 0) {

/* hacer algo */

exit(3);

} else{while (pid != wait(&status));

}

}

Repasomúltiples procesos (bloqueante)

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid != 0) {

while (pid != wait(&status));

} else{

/* hacer algo */

exit(3);

}

pid = fork();if (pid != 0) {

while (pid != wait(&status));

} else{

/* hacer algo */

exit(3);

}

}

42

Page 43: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid == 0) {

/* hacer algo */

exit(3);

} else{while (pid != wait(&status));

}

pid = fork();if (pid == 0) {

/* hacer algo */

exit(3);

} else{while (pid != wait(&status));

}

}

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid == 0) {

/* hacer algo */

exit(3);

} else{while (pid != wait(&status));

}

pid = fork();if (pid == 0) {

/* hacer algo */

exit(3);

} else{while (pid != wait(&status));

}

}

Repasomúltiples procesos (bloqueante)

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid != 0) {

while (pid != wait(&status));

} else{

/* hacer algo */

exit(3);

}

pid = fork();if (pid != 0) {

while (pid != wait(&status));

} else{

/* hacer algo */

exit(3);

}

}

43

Page 44: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid == 0) {

/* hacer algo */

exit(3);

} else{while (pid != wait(&status));

}

pid = fork();if (pid == 0) {

/* hacer algo */

exit(3);

} else{while (pid != wait(&status));

}

}

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid == 0) {

/* hacer algo */

exit(3);

} else{while (pid != wait(&status));

}

pid = fork();if (pid == 0) {

/* hacer algo */

exit(3);

} else{while (pid != wait(&status));

}

}

Repasomúltiples procesos (bloqueante)

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();if (pid != 0) {

while (pid != wait(&status));

} else{

/* hacer algo */

exit(3);

}

pid = fork();if (pid != 0) {

while (pid != wait(&status));

} else{

/* hacer algo */

exit(3);

}

}

44

Page 45: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Repasomúltiples procesos (no bloqueante)

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

while (pid != wait(&status));

}

45

Page 46: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Repasomúltiples procesos (no bloqueante)

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

while (pid != wait(&status));

}

46

Page 47: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Repasomúltiples procesos (no bloqueante)

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

while (pid != wait(&status));

}

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

while (pid != wait(&status));

}

47

Page 48: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Repasomúltiples procesos (no bloqueante)

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

while (pid != wait(&status));

}

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

while (pid != wait(&status));

}

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

while (pid != wait(&status));

}

48

Page 49: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Repasomúltiples procesos (no bloqueante)

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

while (pid != wait(&status));

}

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

while (pid != wait(&status));

}

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

while (pid != wait(&status));

}

49

Page 50: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

while (pid != wait(&status));

}

Repasomúltiples procesos (no bloqueante)

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

while (pid != wait(&status));

}

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

while (pid != wait(&status));

}

50

Page 51: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

while (pid != wait(&status));

}

Repasomúltiples procesos (no bloqueante)

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

while (pid != wait(&status));

}

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

while (pid != wait(&status));

}

51

Page 52: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

while (pid != wait(&status));

}

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

while (pid != wait(&status));

}

Repasomúltiples procesos (no bloqueante)

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

while (pid != wait(&status));

}

52

Page 53: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

while (pid != wait(&status));

}

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

while (pid != wait(&status));

}

Repasomúltiples procesos (no bloqueante)

#include <sys/types.h>

#include <stdio.h>

main() {

pid_t pid;

int status;

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

pid = fork();

if (pid == 0) {

/* hacer algo */

exit(3);

}

while (pid != wait(&status));

}

53

Page 54: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Agenda

Linux EjerciciosServicios para procesos

54

Page 55: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Parcial del curso 2010-2011Ejercicio 2 (3 puntos)

• Se desea implementar un proceso que lea un número desde el teclado y comience a escribir una secuencia de números consecutivos a partir del número introducido. Simultáneamente deberá seguir leyendo del teclado y en el momento en que se produzca otra entrada cambiará la secuencia de números que aparecen por pantalla.

55

Page 56: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Parcial del curso 2010-2011Ejercicio 2 (3 puntos)

• Un ejemplo de ejecución sería el siguiente: $> miprograma

27

28

29

30

31

32

5

6

7

8

3

4

5

0

Fin del programa

$> -

Número introducido por teclado

Número introducido por teclado

Número introducido por teclado

Número introducido por teclado

56

Page 57: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Parcial del curso 2010-2011Ejercicio 2 (3 puntos)

• Puesto que no se pueden simultanear en un mismo proceso la lectura teclado y escritura en la pantalla, se decide realizar un programa con:– un proceso padre que continuamente está leyendo por

teclado, si la entrada es un número entero lanza un proceso hijo cuya misión consiste en escribir números consecutivos a partir del introducido.

– Cuando el usuario introduzca otro número el padre mata al proceso que estaba escribiendo y lanza un nuevo hijo con la misma labor.

– El programa termina cuando el usuario introduce un 0, en este caso el padre mata al proceso en ejecución y termina el programa sacando por pantalla el literal “Fin del programa”

57

Page 58: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Parcial del curso 2010-2011Ejercicio 2 (3 puntos)

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

int main ( void )

{

int contador;

pid_t pid;

scanf (“%d”,&contador);

while (contador)

{

pid = fork();

switch (pid)

{

case 0: /* estoy en el hijo */

while (1) { printf(“%d”,++contador ); sleep(1); }

case –1: perror(“error al ejecutar el fork”)

exit(-1) ;

default: scanf (“%d”, &contador);

kill(pid,9);

}

}

printf(“Fin del programa”);

}

58

Page 59: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Final del curso 2008-2009Ejercicio 5 y 6 (3.5 puntos)

• Escribir una función en C sobre UNIX que cree tres procesos comunicados mediante una tubería, de manera que dos de ellos tengan la salida estándar asociada a la tubería y el otro la entrada estándar.Argumentos: nombres de programa que deberán ejecutar los tres procesos hijos.

Proceso A

Proceso B

tubería Proceso C

59

Page 60: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Final del curso 2008-2009Ejercicio 5 y 6 (3.5 puntos)

#include <stdio.h>

int main( void )

{

int tuberia[2];

int pid1, pid2;

/* el proceso padre, que crea el pipe, será el proceso p1 */

if (pipe(tuberia) < 0) {

perror(“No se puede crear la tubería”) ;

exit(0);

}

/* se crea el proceso p2 */

switch ((pid1=fork()) {

case -1: perror(“Error al crear el proceso”) ;

/* se cierra el pipe */

close(tuberia[0]) ;

close(tuberia[1]) ;

exit(0) ;

break ;

60

Page 61: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Final del curso 2008-2009Ejercicio 5 y 6 (3.5 puntos)

case 0: /* proceso hijo, proceso p2 */

/* se cierra el descriptor de lectura del pipe */

close(tuberia[0]) ;

/* aquí iría el código del proceso p2 */

/* escribiría usando el descriptor tuberia[1] */

break ;

default: /* el proceso padre crea ahora el proceso p3 */

switch ((pid2 = fork()) {

case -1: perror(“Error al crear el proceso”) ;

close(tubería[0]) ;

close(tubería[1]) ;

/* se mata al proceso anterior */

kill(pid1, SIGKILL) ;

exit(0) ;

case 0: /* proceso hijo (p3) lee de la tubería */

close(tubería[1]) ;

/* código del proceso p3 que lee de la tubería */

break ;

default: /* el proceso padre (p2) escribe en la tubería */

close(tuberia[0]) ;

/* código del proceso p1 que escribe en la tubería */

break ;

}

}

61

Page 62: Clase10: lenguaje C: procesos (v1c)

ARCOS @ UC3MAlejandro Calderón Mateos

Sistemas Operativossesión 10: procesos

Grado en Ingeniería Informática

Universidad Carlos III de Madrid