O agendamento entre pai e filho já foi discutido (pelo menos) em Quando os processos filhos são executados e Como a chamada do sistema fork realmente funciona .
Mas, nesse caso, há também a questão do buffer em stdio
.
Você está usando fprintf()
para gravar em um arquivo normal. Por padrão, stdio
armazena em buffers a saída para arquivos regulares até que dados suficientes sejam gravados, para economizar na sobrecarga da chamada do sistema. No x86 Linux, ele geralmente parece escrever em blocos de 4096 bytes, mas você não pode contar com isso, a menos que você configure o buffer manualmente (veja setbuf()
e amigos).
Você pode ver isso com um comando como strace
que mostra as chamadas do sistema que um programa faz.
Portanto, embora você não possa fazer previsões sobre qual processo é executado primeiro, neste caso, você pode prever que a
s são gravados consecutivamente e b
s também. Você só pode obter bbbbbaaaaaaaaaa
ou aaaaaaaaaabbbbb
, e qual você obtém depende do acaso.