Sistemas Informáticos

Folha de perguntas n. 4

7 de Junho de 1995

Nome do aluno: login:

NOTA: nas perguntas de resposta múltipla apenas serão consideradas respostas com somente uma marca, por exemplo x.

1) Considere o seguinte fragmento de um programa em C:

sigset_t set;

sigfillset(&set);

sigdelset(&set, SIGINT);

sigprocmask(SIG_BLOCK, &set, NULL);

O objectivo é que:

__ todos os sinais fiquem bloqueados se SIGINT não está na máscara actual

__ todos os sinais fiquem bloqueados excepto SIGINT

__ SIGINT fique bloqueado

__ nenhum deles

2) Para repôr a máscara de sinais com um dado valor e fazer pause() numa só operação, pode usar:

__ sigsuspend() __ sigsetjump()

__ sigprocmask() __ todas

3) Se a chamada a sigsuspend(&sigmask) terminar normalmente, a máscara de sinais passa a ser:

__ sigmask __ a anterior à chamada

__ a união da máscara anterior com sigmask __ nenhuma destas respostas

4) A chamada popen() é equivalente a chamar (com os argumentos apropriados):

__ pipe() + fork() + close() + exec() + wait()

__ pipe() + fork() + exec()

__ pipe() + fork() + close() + exec()

__ nenhuma destas respostas

5) O seguinte fragmento de um programa em C:

int fd[2]; pid_t pid;

pipe(fd);

pid= fork();

if (pid > 0) {

close(fd[1]); ...

} else {

close(fd[0]); ...

}

estabelece um canal de comunicação:

__ do processo pai para o processo pid

__ do processo pid para o processo pai

__ bidireccional entre o processo pai e o processo pid

__ nenhuma destas respostas

6) Por forma a ter um processo filho a correr comando1 e ler o seu stdout, pode usar-se:

__ popen("comando1", "w")

__ popen("comando1", "r")

__ mkfifo("comando1", O_RDONLY | O_NONBLOCK)

__ todas estas chamadas

7) Faça um esboço de uma possível implementação de signal() usando sigaction():

8) Escreva um fragmento de de um programa em C que estabelece um limite de 10 segundos para efectuar read() de uma linha do stdin

jlopes