Departamento de Engenharia Electrotécnica e de Computadores
Sistemas Informáticos
Prova de Recurso, 22 de Setembro de 1995
II Parte,
DURAÇÃO MÁXIMA 60 minutos, com consulta

1 Em UNIX, a entrada/saída (E/S) usando chamadas directas ao Kernel chama-se E/S não bufferizada.

a. Isso quer dizer que chamadas a read() e write() não são bufferizadas? Justifique.

b. Compare em termos de eficiência e quanto ao uso de buffers, chamadas directas ao Kernel com E/S usando a biblioteca standard de C.

2 Considere o seguinte programa:

1 int main(void) {

2 int fd; pid_t pid;

3 fd= open("f1",O_RDWR|O_SYNC|O_APPEND);

4 pid= fork();

5 if (pid==0) {

6 int fd2;

7 fd2= open("f2",O_RDWR);

8 dup2(fd2,STDOUT_FILENO);

9 close(fd2);

10 }

11 exit(0);

12 }

a. Desenhe o diagrama de ficheiros abertos após a execução da linha 9 do programa.

b. Para que serve o código da linha 3?

3 Considere o seguinte programa:

1 int main(void) {

2 FILE *f;

3 char buf1[]= "the quick brown fox jumps";

4 char buf2[]= " over the lazy dog\n";

5 f= fopen("f2","w");

6 fputs(buf1,f);

7 fputs(buf1,stdout);

8 fputs(buf2,f);

9 fputs(buf2,stdout);

10 fclose(f);

11 exit(0);

12 }

a. Se o ficheiro f2 existir e o programa for iniciado sem redireccionamento do stdout, explique o que acontece (e quando!) com os caracteres escritos até estes chegarem ao terminal ou ao ficheiro, passando pelo kernel.

b. Quais são as diferenças entre exit() e _exit()?

4

a. Descreva, através de um programa em C, todos os passos necessários à criação de uma secção de memória partilhada de tamanho 1000 bytes, com permissões de leitura e escrita para o dono e de leitura para o grupo, e à escrita da string BLA no endereço inicial.

b. Como pode ser usada, de forma fiável, para transmitir informação entre dois processos?

NB! No código apresentado, para simplificar, não são testadas eventuais condições de erro.