Pular para o conteúdo principal

Questão de Sistemas Operacionais — Scripts em Unix e Linux — Avança SP 2023

Sistemas OperacionaisScripts em Unix e Linux
Código
qa543427
Banca
Avança SP
Órgão
Pref Americana
Ano
2023
Cargo
Ana ( )
Nos sistemas UNIX, a criação de novos processos é feita em duas etapas: na primeira etapa, um processo cria uma réplica de si mesmo, usando a chamada de sistema:
  1. Afork().
  2. Bmain().
  3. Cnord().
  4. Dcrud().
  5. Ecount().
Revelar gabarito e comentário

GabaritoA — fork().

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 no UNIX: a chamada fork()

Gabarito: letra A. A criação de novos processos no UNIX é feita em duas etapas: na primeira, o processo pai cria uma réplica exata de si mesmo por meio da chamada de sistema fork(); na segunda, o processo filho usa execve() para carregar um novo programa. As demais alternativas (main(), nord(), crud(), count()) não são chamadas de sistema de criação de processos no UNIX.

A criação de processos é um dos conceitos fundamentais de sistemas operacionais. No UNIX, o mecanismo é deliberadamente dividido em duas fases para dar flexibilidade ao programador. A primeira fase, fork(), duplica o processo chamador: o processo filho é uma cópia quase idêntica do pai, com o mesmo código, dados, pilha e descritores de arquivos. A segunda fase, execve(), substitui a imagem de memória do processo filho por um novo programa. Essa separação permite que o filho, entre a fork() e a execve(), manipule seus descritores de arquivos para realizar redirecionamentos de entrada, saída e erro padrão — algo que seria impossível se a criação e a carga do programa fossem feitas em uma única chamada, como ocorre no Windows com CreateProcess().

O funcionamento da fork() é peculiar: ela é invocada por um processo, mas retorna para dois. O processo pai recebe o PID do filho como retorno; o processo filho recebe 0. Isso permite que o código distinga quem é quem e tome caminhos diferentes. O Linux moderno implementa fork() com a técnica de copy-on-write: o filho compartilha as páginas de memória do pai, e a cópia real só ocorre quando um dos dois tenta escrever — otimização que evita o custo de copiar toda a memória a cada criação de processo.

A hierarquia de processos é outra consequência direta desse modelo: cada processo tem um pai, formando uma árvore de processos. O processo init (PID 1) é o ancestral de todos os demais. O comando pstree permite visualizar essa árvore. Essa estrutura é exclusiva do UNIX — no Windows, todos os processos têm o mesmo nível hierárquico.

A pegadinha desta questão é simples: o candidato pode confundir fork() com execve() ou com a função main(). A main() é o ponto de entrada de um programa em C, não uma chamada de sistema. As alternativas nord(), crud() e count() são invenções sem qualquer relação com criação de processos. Guarde o par: fork() cria a réplica; execve() carrega o novo programa.

  1. 1fork() — cria réplica do processo
  2. 2execve() — carrega novo programa
LEVEL · soulevel.com.br

Alternativa A — ✅ Correta ⟵ GABARITO

A chamada de sistema fork() é exatamente o que o enunciado descreve: na primeira etapa da criação de processos no UNIX, um processo cria uma réplica de si mesmo. O processo filho herda o código, os dados, a pilha e os descritores de arquivos do pai. É a base do modelo de criação de processos do UNIX.

Alternativa B — ❌ Incorreta

main() é a função de entrada de um programa em linguagem C, não uma chamada de sistema. Ela é o ponto onde a execução de um programa começa, mas não tem relação com a criação de processos pelo sistema operacional.

Alternativa C — ❌ Incorreta

nord() não existe como chamada de sistema no UNIX nem em qualquer sistema operacional conhecido. É um distrator puro, sem correspondência com nenhuma função real.

Alternativa D — ❌ Incorreta

crud() não é uma chamada de sistema. O termo CRUD (Create, Read, Update, Delete) refere-se às operações básicas de persistência em bancos de dados, não à criação de processos.

Alternativa E — ❌ Incorreta

count() não é uma chamada de sistema de criação de processos. Não há nenhuma função com esse nome no conjunto de chamadas de sistema do UNIX para essa finalidade.

NÃO CAIA NESSA!

A banca aposta na confusão entre fork() e execve(). Muitos candidatos lembram que a criação envolve duas etapas, mas trocam a ordem ou o nome das chamadas. A fork() é a primeira etapa — cria a réplica; a execve() é a segunda — carrega o novo programa. Outra armadilha é confundir fork() com a função main(), que é apenas o ponto de entrada de um programa em C, não uma chamada de sistema. Com esse par bem fixado, você elimina as alternativas erradas de imediato.

PEGA ESSA DICA!

Para memorizar o par, pense: fork = garfo, que divide um processo em dois; exec = executar, que substitui a imagem do processo por um novo programa. Quando a questão perguntar sobre criação de processos no UNIX, a resposta quase sempre envolve fork() e execve() — raramente uma chamada única. Se aparecer CreateProcess(), lembre-se: essa é a abordagem do Windows, que faz as duas etapas de uma só vez.

Gabarito: letra A

Link permanente: /questoes/qa543427