Questão de Arquitetura de Software — Software — FCC 2023
Arquitetura de Software›Software
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:
Aadvogado(i);
Badvogado(i); exit(0);
Cadvogado(i+1);
Dadvogado(i+1); break(1);
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.