Я предполагаю, что вы не изменили настройки грязных страниц ядра. Для вашего варианта использования я бы попробовал что-то вроде этого:
/proc/sys/vm/dirty_background_bytes:50000000
/proc/sys/vm/dirty_bytes:4000000000
/proc/sys/vm/dirty_expire_centisecs:100
/proc/sys/vm/dirty_writeback_centisecs:20
(см. https://www.kernel.org/doc/Documentation/sysctl/vm.txt для подробностей.)
Проблема в основном в том, что ограничения ядра по умолчанию проблематичны, если в вашей системе много оперативной памяти и достаточно медленное устройство хранения, и вы ищете низкую задержку в худшем случае. На практике буфер системной подсистемы ввода-вывода заполнен, и ему необходимо принудительно перевести процессы записи в спящий режим до тех пор, пока на блокированные устройства не будет записано достаточно данных («сброс грязных страниц»).
Из вашего вопроса неясно, какой текст вы действительно ожидаете в конечном итоге в файле.
В оболочке вы можете сделать
echo 'ab' | sudo tee myLog.txt
, чтобы «ab» записывалась в myLog.txt
и также отображалась в стандартном выводе. Причина использования tee
обычно заключается в его побочном эффекте, так что вам не нужно запускать оболочку как привилегированный пользователь, и вывод на стандартный вывод на самом деле нежелателен; так что вы можете добавить перенаправление, чтобы подавить это.
echo 'ab' | sudo tee myLog.txt >/dev/null
В вызове системы (3) в коде C вы можете просто поместить это в строку:
system("echo 'ab' | sudo tee myLog.txt >/dev/null");
Следующее в основном не определено:
echo 'ab' | echo 'Logging enabled'
но обычно просто отбрасывает " ab ", потому что второе echo
ничего с ним не делает, а вместо этого производит собственный вывод. Если вы хотите объединить два фрагмента текста, попробуйте что-нибудь вроде
printf "%s\nLogging enabled\n" "$(echo ab)"
, но опять же, крайне неясно, что и если да, то как вы хотите сделать с двумя отдельными операторами echo
.
(Чтобы повторить очевидное, a | b
соединяет стандартный вывод a
со стандартным вводом b
и запускает два процесса параллельно, со стандартным входом, по-прежнему подключенным к стандартному входу a
, и стандартным выходом, исходящим из b
.)