Есть простенькая программка#include<stdio.h>
#include<unistd.h>int main ()
{
int i;for (i = 0; i < 2; i ++) {
fork();
printf ("+");
}
return 0;
}Никак не могу понять, почему выводится 8 плюсов?
> Никак не могу понять, почему выводится 8 плюсов?2^3 = 8
>[оверквотинг удален]
> {
> int i;
> for (i = 0; i < 2; i
> ++) {
> fork();
> printf ("+");
> }
> return 0;
> }
> Никак не могу понять, почему выводится 8 плюсов?Попробуйте вот так и немного подумайте над результатом :)
#include<stdio.h>
#include<unistd.h>int main ()
{
int i;for (i = 0; i < 2; i ++) {
fork();
printf ("+ | i: %d pid: %d ppid: %d\n", i, getpid(), getppid());
}
return 0;
}
Для тех кому лень, вот что выводится. Подсказка: Сколько имено процессов мы запускаем?+ | i: 0 pid: 17247 ppid: 22353
+ | i: 0 pid: 17248 ppid: 17247
+ | i: 1 pid: 17247 ppid: 22353
+ | i: 1 pid: 17248 ppid: 17247
+ | i: 1 pid: 17250 ppid: 1
+ | i: 1 pid: 17249 ppid: 1
> Для тех кому лень, вот что выводится. Подсказка: Сколько имено процессов мы
> запускаем?
> + | i: 0 pid: 17247 ppid: 22353
> + | i: 0 pid: 17248 ppid: 17247
> + | i: 1 pid: 17247 ppid: 22353
> + | i: 1 pid: 17248 ppid: 17247
> + | i: 1 pid: 17250 ppid: 1
> + | i: 1 pid: 17249 ppid: 1И, кстати, когда процессы умирают? И кто их убивает?
> И, кстати, когда процессы умирают? И кто их убивает?А зачем их убивать, если они умирают. Некрофаг чтоля? :)
> Попробуйте вот так и немного подумайте над результатом :)В данном случае всё понятно, как и ожидалось 6 плюсов. Но откуда в моём примере берётся 8 плюсов? Какие-то заморочки с буферизацией что ли ?
> Какие-то заморочки с буферизацией что ли ?Вот так меняю программу
int main ()
{
int i;for (i = 0; i < 2; i ++) {
fork();
printf (" i: %d pid: %d ppid: %d\n", i, getpid(), getppid());
printf ("+");
}
return 0;
}вот, что выводит
i: 0 pid: 6319 ppid: 4752
i: 0 pid: 6320 ppid: 6319
+ i: 1 pid: 6319 ppid: 4752
++ i: 1 pid: 6320 ppid: 6319
++ i: 1 pid: 6322 ppid: 1
++ i: 1 pid: 6321 ppid: 1
+
>> Попробуйте вот так и немного подумайте над результатом :)
> В данном случае всё понятно, как и ожидалось 6 плюсов. Но откуда
> в моём примере берётся 8 плюсов? Какие-то заморочки с буферизацией что
> ли ?Да, вы правы, это сложнее чем мне казалось вначале.
И наверно это действительно можно обьяснить буферизацией. Когда потомок форкается, он наследует буфер вывода от родителя, при этом буфер копируется потомку при попытке потомка вывести новый '+'. Теперь есть два буфера, один у родителя, второй у потомка, оба содержат '++'. Ваш первый вариант не выводил '\n' явно, поэтому все буфера выводились в конце работы процесса. Так все потомки, даже те которые по коду программы должны были вывести только один '+', фактически выводили два, из скопированного от родителя буфера вывода.
Немножко поэкпериментровал. Если написатьprintf ("+");
fflush(stdout);или
write(fileno(stdout), "+", 1);
то выподится 6 плюсов, как и должно быть. Да, буферизация в printf приводит к таким непредвиденным результатам. Будте внимательны, коллеги :-)
> Немножко поэкпериментровал. Если написать
> printf ("+");
> fflush(stdout);
> или
> write(fileno(stdout), "+", 1);
> то выподится 6 плюсов, как и должно быть. Да, буферизация в printf
> приводит к таким непредвиденным результатам. Будте внимательны, коллеги :-)
#include <stdio.h>
#include <unistd.h>int main()
{
int i;setbuf(stdout, NULL);
for (i = 0; i < 2; i++) {
fork();
printf("+");
}
return 0;
}И ваще
int main() { return write(1, "++++++", 6); }