FACULDADE DE ENGENHARIA DA UNIVERSIDADE DO PORTO
LICENCIATURA EM ENGENHARIA ELECTROTÉCNICA E DE COMPUTADORES
Sistemas Informáticos
II Chamada, 13 de Julho de 1996
II Parte, Duração máxima 60 minutos, com consulta

1 (2.5) Considere o seguinte programa:

1 /* ... */

2 char buf[]= "The quick brown fox jumps over the lazy dog";

3 int main(void)

4 {

5 int fd;

6 if ((fd= creat("f",S_IRUSR|S_IWUSR|S_IRGRP))<0) err("erro");

7 if (write(fd,buf,20)<0) err_sys("write error");

8 if (lseek(fd,1024,SEEK_CUR)==-1) err_sys("lseek error");

9 if (write(fd,buf,20)<0) err_sys("write error");

10 exit(0);

11 }

1.1 Diga qual o resultado da execução do programa e justifique a sua resposta.

1.2 Diga qual o conteúdo da variável buf depois de executar as seguintes chamadas no mesmo directório em que foi executado o programa anterior:

1 if ((fd= open("f",O_RDONLY))<0) err_sys("open error");

2 if (lseek(fd,512,SEEK_SET)==-1) err_sys("lseek error");

3 if (read(fd,buf,10)!=10) err_sys("read error");

2 (2.5) Considere que o processo 1024 tem o seguinte diagrama de ficheiros abertos:

e corre o seguinte programa:

1 /* ... */

2 if ((fd= open("data",O_RDWR))<0) err_sys("open error");

3 if ((pid= fork())<0) err_sys("fork error");

4 else if (pid>0)

5 {

6 if (dup2(fd,STDOUT_FILENO)<0) err_sys("dup2 error");

7 waitpid(pid,NULL,0);

8 exit(0);

9 }

10 /* ... */

2.1 Desenhe o diagrama de ficheiros abertos para os processos 1024 e pid na linha 7 do programa apresentado acima.

2.2 Compare os valores guardados nos campos `current file offset' e `current file size'. Diga porque é que `current file size' tem de residir em `v-node table' em vez de `file table'.

3 (2.5) Considere o seguinte programa:

1 char var1[]= "The quick brown fox ";

2 char var2[];

3 int main(void)

4 {

5 char var3[]= "jumps over the lazy dog";

6 static char var4[];

7 var2= (char *) malloc(12);

8 var4= (char *) malloc(12);

9 exit(0);

10 }

3.1 Situe no mapa de memória do processo UNIX respectivo, as seguintes áreas de memória: var1, var2, var3, var4, var2[], var3[].

3.2 As funções setjmp() e longjmp() são usadas em situações de erro para saltar de um registo de activação profundamente na stack para outro registo de activação mais antigo.

Diga como são usadas estas funções, apresente uma situação do seu uso de forma errada e diga qual o valor que espera encontrar numa variável na stack (`automatic' em C) após longjmp() relativamente ao seu valor aquando do setjmp() correspondente.

4 (2.5) Em UNIX há várias formas de dois ou mais processos trocarem informação entre si.

4.1 Escreva dois programas em C, distintos, que comunicam entre eles a seguinte mensagem:

"The quick brown fox jumps over the lazy dog"

O primeiro programa envia a mensagem e garante que é lida e o segundo processo recebe a mensagem e escreve-a em stdout.

4.2 Diga como e em que condições pode remover uma FIFO?

(Total: 10.0/20.0) JCL