OS: Linux, Język: pure Cprintf anomalia po "fork()"
ruszam naprzód nauki programowania C w ogóle, a programowanie C pod UNIX w szczególnym przypadku.
Wykryłem dziwne (dla mnie) zachowanie funkcji printf()
po użyciu połączenia fork()
.
Kod
#include <stdio.h>
#include <system.h>
int main()
{
int pid;
printf("Hello, my pid is %d", getpid());
pid = fork();
if(pid == 0)
{
printf("\nI was forked! :D");
sleep(3);
}
else
{
waitpid(pid, NULL, 0);
printf("\n%d was forked!", pid);
}
return 0;
}
Wyjście
Hello, my pid is 1111
I was forked! :DHello, my pid is 1111
2222 was forked!
Dlaczego drugi "Hello" string wystąpić na wyjściu dziecka?
Tak, to jest dokładnie to, co rodzic wydrukował, gdy zaczął, z rodzicem pid
.
Ale! Jeśli kładziemy \n
charakter na końcu każdego łańcucha możemy uzyskać oczekiwany wynik:
#include <stdio.h>
#include <system.h>
int main()
{
int pid;
printf("Hello, my pid is %d\n", getpid()); // SIC!!
pid = fork();
if(pid == 0)
{
printf("I was forked! :D"); // removed the '\n', no matter
sleep(3);
}
else
{
waitpid(pid, NULL, 0);
printf("\n%d was forked!", pid);
}
return 0;
}
Output:
Hello, my pid is 1111
I was forked! :D
2222 was forked!
Dlaczego tak się dzieje? Czy to jest prawidłowe zachowanie, czy jest to błąd?
Ok, rozumiem. Ale wciąż nie potrafię wyjaśnić, dlaczego "śmieci buforowe" pojawiają się na końcu nowo wydrukowanej linii na wyjściu dziecka? Ale czekaj, teraz wątpię, że to naprawdę wynik DZIECKA .. oh, czy mógłbyś wyjaśnić, dlaczego wyjście wygląda DOKŁADNIE (nowy ciąg PRZED starym) tak, krok po kroku, więc byłbym bardzo wdzięczny. Dziękuję i tak! – pechenie
Bardzo imponujące wyjaśnienie! Dziękuję bardzo, wreszcie zrozumiałem to wyraźnie! P.S .: Już wcześniej głosowałem za, a teraz głupio kliknąłem "strzałkę w górę" jeszcze raz, więc głos zniknął. Ale nie mogę ci go jeszcze raz dać, ponieważ "odpowiedź jest zbyt stara" :( P.P.S .: Dałem Ci głos w innym pytaniu i jeszcze raz dziękuję! – pechenie