FACULDADE DE ENGENHARIA DA UNIVERSIDADE DO PORTO
Licenciatura em Engenharia Electrotécnica e de Computadores
Sistemas Informáticos
1 Chamada, 29 de Junho de 1996
II Parte, Duração máxima 60 minutos, com consulta
1 (2.5) Considere o seguinte programa:

1 /* ... */

2 int main(void)

3 {

4 int fd;

5 struct stat sbuf;

6 umask(S_IXGRP|S_IWOTH|S_IXOTH);

7 if (creat("filex",S_IRWXU|S_IRWXG)<0) err_sys("creat error");

8 if (stat("filex",&sbuf)<0) err_sys("stat error");

9 if (chmod("filex",(sbuf.st_mode & ~S_IWGRP)|S_IROTH)<0) err_sys("stat error");

10 exit(0);

11 }

1.1 Diga quais as permissões que ficam associadas ao ficheiro filex e justifique a sua resposta.

1.2 Diga qual o efeito de estabelecer nas permissões do ficheiro na linha 7 do programa o bit S_ISGID (`set group ID on execution').

2 (2.5) As chamadas às funções da biblioteca standard de entrada/saída tratam da bufferização dos dados aquando da transferência para o kernel usando buffers de tamanho ideal.

2.1 Diga qual é o tamanho ideal do buffer e justifique a sua resposta.

2.2 Diga que tipos de `bufferização' podem ser mantidos pela biblioteca standard de entrada/saída e em que consistem. Dê exemplos de ficheiros que, por omissãom, usam cada um deles.

3 (2.5) Sinais são interrupções de software relacionadas com acontecimentos assíncronos.

3.1 Diga que tipos de disposições (ou acções associadas) podem ser estabelecidas para sinais e em que consistem.

3.2 Diga como pode conseguir enviar para o stdout a mensagem "alarm on." sempre que um processo recebe o sinal SIG_ALARM.

4 (2.5)

4.1 Escreva um programa em C que estabeleça um canal de comunicação entre um processo pai e um processo filho; o filho envia para o pai a cadeia de caracteres "The quick brown fox jumps over the lazy dog" e o pai envia-a para o stdout. Deve ter o cuidado de fechar os lados da pipe que não são usados pelos processos.

4.2 Diga o que acontece quando um processo lê de uma pipe com read() e não há nenhum processo com o lado de escrita aberto para essa pipe. E se um processo tentar escrever para uma pipe com write() e não há nenhum processo com o lado de leitura aberto para essa pipe?

(Total: 10.0/20.0)

JCL