int pid;
int fd;
int main()
{
int defout = dup(1);
fd=open("/prova/out.txt", O_RDWR|O_CREAT);
dup2(fd, 1); // redirect output to the file
pid = fork(); // create child
if (!pid) // if pid==0 then its a child process
{
close(fd);
close(defout);
printf("STAMPA1\n");
# <<< Missing an exit() here
}
# This part is executed twice, once by each process
dup2(defout, 1); // redirect output back to stdout
close(fd);
close(defout);
waitpid(pid, 0, 0); // wait until child finishes
printf("STAMPA2\n");
}
По накладным расходам, посчитаем. Пакет ethernet по максимуму (не совсем!) равен 1500 байт, из них 18 байт на заголовок ethernet, 22 байта на заголовок TCP, и iSCSI заголовок 48. Итого чистых данных у нас 1412 байт это ~94% от пропускной способности. Но так как по ethernet еще бегает куча всего типа ARP и прочего, то принято говорить о 8-10% накладных расходов. Еще стоит учесть, что не всегда будут гоняться именно большие блоки, отнимите еще 10-20%, получите те самые 20% на круг.
Всё ли так плохо?! Да нет, первое, что нужно учесть - увеличить размер кадра ethernet до например 9000 (так называемые jumbo frames), включаем опцию на коммутаторах и сетевых адаптерах, получаем 8912 байт чистого трафика 99% пропускной способности! :-)
Теперь о задержках (так называемая latency): оно примерно 50-125 us (для 1ge), но может снижаться из-за загрузки коммутаторов/адаптеров/CPU. В принципе нормально. Как повысить отзывчивость? Переходить на 10ge (5-50 us) или infiniband (3-5 us).
Дополнительно, если работаем на 1ge, сделать bonding из двух/четырех портов в один.
Ну и не скупитесь на нормальные коммутаторы (например dlink DGS 3420 замечательно работают и не очень больно, как киски/хуйли-ты-паккард). Где можно ходите оптикой, она нынче как грязь, сразу одномод кладите (с заделом на 10ge).
PS. С другой стороны, если будете полностью переходить на 10ge, то рекомендую посмотреть на infiniband - по стоимости практически тоже самое, а в скорости в 4 раза больше (но есть и нюансы конечно...).