[18]. Quantas vezes o código abaixo imprime a palavra “hello”?
int main(int argc, char **argv) {
int i;
for (i=0; i < 3; i++) {
fork();
printf(“hello\n”);
}
}

Passo 1

O enunciado pede: “Quantas vezes o código abaixo imprime a palavra ‘hello’?” O código relevante dá estas informações:
  • O laço for executa exatamente 3 iterações: para i=0,\,1,\,2.
  • Em cada iteração existe uma chamada a fork() seguida de printf("hello\n");.
  • A função fork() cria um processo filho que continua a execução a partir do ponto da chamada, assim tanto o processo pai quanto o filho continuam após o fork().

Passo 2

Entender o efeito de fork() é essencial. Se antes de um fork() existem n processos ativos, após esse fork() cada um desses n processos cria um filho, passando a haver 2n processos no total. Logo, cada fork() dobra o número de processos existentes.
Explicando bem mastigado: suponha que há 1 processo (o programa inicial). Quando esse processo executa fork() ele gera mais 1 processo (o filho), totalizando 2. Se cada um desses 2 executar outro fork(), cada um gera mais 1, passando a haver 4, e assim por diante.

Passo 3

Vamos seguir a execução iteração por iteração, contando quantos processos imprimem em cada passo. Lembre que o printf("hello\n") é executado por todos os processos existentes logo após o fork() daquela iteração.
  • Antes do laço começa 1 processo.
  • Iteração i=0:
    • O fork() duplica os processos: passam de 1 para 2.
    • Cada um dos 2 processos executa printf, portanto são produzidas 2 impressões de "hello".
  • Iteração i=1:
    • Antes do fork() desta iteração existem 2 processos.
    • O fork() duplica para 4 processos.
    • Cada um dos 4 processos executa printf, produzindo 4 impressões nesta iteração.
  • Iteração i=2:
    • Antes do fork() desta iteração existem 4 processos.
    • O fork() duplica para 8 processos.
    • Cada um dos 8 processos executa printf, produzindo 8 impressões nesta iteração.

Passo 4

Somando as impressões de cada iteração obtemos o total:
2 + 4 + 8.
Podemos escrever isso como soma de potências de dois:
\sum_{k=1}^{3} 2^{k}.
Usando a fórmula da soma geométrica para potências de 2 obtemos a identidade conveniente
\sum_{k=1}^{n} 2^{k} = 2^{n+1}-2,
portanto, para n=3,
\sum_{k=1}^{3} 2^{k} = 2^{4}-2 = 16-2 = 14.

Passo 5

Observações finais úteis para a prova (curtas e práticas):
  • Cada fork() dobra o número de processos; por isso a contagem por iteração segue 2^{1},2^{2},2^{3}.
  • O printf com \n força a impressão na saída (evita surpresas de buffer), então cada processo realmente gera uma linha "hello".
  • Se o laço tivesse n iterações, o total seria \sum_{k=1}^{n}2^{k}=2^{n+1}-2.

Resposta

14

Exercícios relacionados