[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”);
}
}
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
forexecuta exatamenteiterações: para . - Em cada iteração existe uma chamada a
fork()seguida deprintf("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 ofork().
Passo 2
Entender o efeito de processos ativos, após esse processos cria um filho, passando a haver
processos no total. Logo, cada
fork() é essencial. Se antes de um fork() existem
fork() cada um desses
fork() dobra o número de processos existentes.Explicando bem mastigado: suponha que há
processo (o programa inicial). Quando esse processo executa processo (o filho), totalizando
. Se cada um desses
executar outro , passando a haver
, e assim por diante.
fork() ele gera mais
fork(), cada um gera mais
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
processo. - Iteração
: - O
fork()duplica os processos: passam depara . - Cada um dos
processos executa printf, portanto são produzidasimpressões de "hello".
- O
- Iteração
: - Antes do
fork()desta iteração existemprocessos. - O
fork()duplica paraprocessos. - Cada um dos
processos executa printf, produzindoimpressões nesta iteração.
- Antes do
- Iteração
: - Antes do
fork()desta iteração existemprocessos. - O
fork()duplica paraprocessos. - Cada um dos
processos executa printf, produzindoimpressões nesta iteração.
- Antes do
Passo 4
Somando as impressões de cada iteração obtemos o total:
Podemos escrever isso como soma de potências de dois:
Usando a fórmula da soma geométrica para potências de
obtemos a identidade conveniente
portanto, para
,
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. - O
printfcom\nforç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
iterações, o total seria .