Pular para o conteúdo principal

Questão de Arquitetura de Software — Software — FCC 2023

Arquitetura de SoftwareSoftware
Código
fc069491
Banca
FCC
Órgão
TRT - 12ª Região (SC)
Ano
2023
Nível
Superior
Cargo
Analista Judiciário - Área de Apoio Especializado (Especialidade Tecnologia da Informação)
Examine o programa em C abaixo.#include <stdio.h>#include <stdlib.h>#include <unistd.h>#define NUM_ADVOGADOS 3void advogado(int id) (printf("Advogado %d: Preparando argumentos\n", id);usleep(rand() % 2000000 + 1000000); // Simula o tempo de preparaçãoprintf("Advogado %d: Apresentando o caso ao tribunal\n", id) ;usleep(rand() % 2000000 + 1000000); // Simula o tempo de apresentaçãoprintf("Advogado %d: Caso resolvido\n", id);}int main() {srand(time(NULL));for (int i = 1; i <= NUM_ADVOGADOS; i ++) (if (fork() == 0) (}}// Código do processo pai (tribunal)for (int i = 1; i <= NUM_ADVOGADOS; i ++) (wait(NULL); // aguarda todos os processos filhos terminarem}printf("Todos os casos foram resolvidos.\n");return 0;}Considerando que uma das saídas do programa acima, compilado e executado em condições ideais, seja:Advogado 1: Preparando argumentosAdvogado 3: Preparando argumentosAdvogado 2: Preparando argumentosAdvogado 3: Apresentando o caso ao tribunalAdvogado 2: Apresentando o caso ao tribunalAdvogado 1: Apresentando o caso ao tribunalAdvogado 1: Caso resolvidoAdvogado 3: Caso resolvidoAdvogado 2: Caso resolvidoTodos os casos foram resolvidos.A lacuna I deve ser corretamente preenchida com:
  1. Aadvogado(i);
  2. Badvogado(i); exit(0);
  3. Cadvogado(i+1);
  4. Dadvogado(i+1); break(1);
  5. Eadvogado((fork(i)); exit(1);
Revelar gabarito e comentário

GabaritoB — advogado(i); exit(0);

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Criação de Processos com fork() em C

Gabarito: letra B. O programa cria três processos filhos com fork(). Cada filho deve executar a função advogado(i) e, em seguida, encerrar-se com exit(0) para não continuar executando o laço wait do pai. A alternativa B é a única que faz ambas as ações corretamente.

Alternativa A — ❌ Incorreta

Falta o exit(0). Sem ele, o processo filho prossegue executando o restante do main (o laço wait e o printf final), causando comportamento indefinido (o filho esperaria por filhos que não criou) e possivelmente travamento ou saída incorreta.

Alternativa B — ✅ Correta ⟵ GABARITO

Contém advogado(i) com o índice i correto e exit(0) para encerrar o filho. Isso produz a saída exibida no enunciado, com os três advogados executando de forma concorrente.

Alternativa C — ❌ Incorreta

Usa advogado(i+1), que deslocaria os identificadores: o filho 1 chamaria com id 2, filho 2 com id 3, etc. A saída fornecida mostra ids 1, 2 e 3, portanto não corresponde.

Alternativa D — ❌ Incorreta

Além do erro de advogado(i+1), usa break(1) que não é uma instrução válida em C (a função break não existe; break é uma instrução de controle sem parâmetros). Causaria erro de compilação.

Alternativa E — ❌ Incorreta

fork(i) é inválido – a função fork() não recebe argumentos. Além disso, a sintaxe advogado((fork(i)) está incorreta (parênteses desbalanceados) e exit(1) encerra com código 1 (não é o problema principal, mas agrava).

NÃO CAIA NESSA!

A banca testa se o candidato lembra que o filho deve chamar exit(0) após executar sua tarefa. Esquecer esse detalhe faz com que o filho continue no código do pai, gerando comportamento inesperado. Outra armadilha é deslocar o índice com i+1 ou usar break(1), que são claramente errados para quem conhece a linguagem.

Gabarito: letra B.

Link permanente: /questoes/fc069491