Пристально и внимательно слежу за жизнью Net/OpenBSD сообществ. Попутно посматриваю в сырцы. Вот что откопал нового и вкусненького:
1) Вместо связки ф-ций lseek() и read()/write() можно использовать ф-цию pread()/pwrite(). (Заметил в свежем diff'е для last(1).)
2) Если вам требуется считать строку неопределённой длинны, то вы можете использовать ф-цию getline(), но, к сожалению, она GNU-специфична. Оказывается, в BSD тоже есть подобная ф-ция — fgetln(), правда, последняя не добавляет завершающий '\0'. (Увидел в diff'е для uniq(1))
3) В NetBSD есть ф-ция, которая устанавливает имя исполняемой программы и которая потом может это имя использовать в выводе сообщений об ошибках, например. Эти ф-ции имеют имена setprogname() и getprogname() соответственно. Впервые появились в NetBSD 1.6. Позже появилась во Фряхе, с версии 4.4 К слову, удалось нагуглить, что эту ф-цию предлагали добавить в libc, но Ulrich Drepper отказался. Кстати, в процессе чтения треда Дреппер подсказал интересный хинт, о том как определить полный путь к программе: «readlink() on /proc/self/exe»
Послесловие: чем отличается setprogname(argv[0])/getprogname() от basename(argv[0]) я не знаю, выглядит очень похоже.
4) Оказывается существует ф-ция, которая судя по ману получает от пользователя ответ на вопрос, причем ответ должен быть вида да/нет, а точнее y/n. Ф-ция называется rpmatch(). (случайно нашел на die.net, в моём RHEL4 его нет, в мане NetBSD тоже, так что на каких системах он водится я не знаю..)
5) В NetBSD существует скриптик, который отыскивает башизмы и пытается их придавить :))) Шутка, конечно, но подобный скрипт, который сообщает о распространённых bash-специфичных конструкциях у них и правда есть — check-portability.awk Изначально был написан на шелле и позже переписан на awk'е, когда rillig@ понял, что «shell has a huge performance problem: When reading files, it calls read(2) for every single byte. awk instead reads a whole line at a time.» (перевожу: shell имеет кучу проблем с производительностью: так при чтении файла он вызывает read(2) для каждого байта, в то время как awk считывает потрочно).
Пока этот скрипт знает лишь про переменную $RANDOM, которой нет в POSIX и операторе сравнения ==, который понимают не все test'ы.
Кстати, ещё любопытный факт: на IRIX'ах отсутствует устройтво /dev/stderr и в POSIX вроде его тоже нет.
Вот такие открытия из мира Unix'ов я узнал и поделился с вами :)
1) Вместо связки ф-ций lseek() и read()/write() можно использовать ф-цию pread()/pwrite(). (Заметил в свежем diff'е для last(1).)
2) Если вам требуется считать строку неопределённой длинны, то вы можете использовать ф-цию getline(), но, к сожалению, она GNU-специфична. Оказывается, в BSD тоже есть подобная ф-ция — fgetln(), правда, последняя не добавляет завершающий '\0'. (Увидел в diff'е для uniq(1))
3) В NetBSD есть ф-ция, которая устанавливает имя исполняемой программы и которая потом может это имя использовать в выводе сообщений об ошибках, например. Эти ф-ции имеют имена setprogname() и getprogname() соответственно. Впервые появились в NetBSD 1.6. Позже появилась во Фряхе, с версии 4.4 К слову, удалось нагуглить, что эту ф-цию предлагали добавить в libc, но Ulrich Drepper отказался. Кстати, в процессе чтения треда Дреппер подсказал интересный хинт, о том как определить полный путь к программе: «readlink() on /proc/self/exe»
Послесловие: чем отличается setprogname(argv[0])/getprogname() от basename(argv[0]) я не знаю, выглядит очень похоже.
4) Оказывается существует ф-ция, которая судя по ману получает от пользователя ответ на вопрос, причем ответ должен быть вида да/нет, а точнее y/n. Ф-ция называется rpmatch(). (случайно нашел на die.net, в моём RHEL4 его нет, в мане NetBSD тоже, так что на каких системах он водится я не знаю..)
5) В NetBSD существует скриптик, который отыскивает башизмы и пытается их придавить :))) Шутка, конечно, но подобный скрипт, который сообщает о распространённых bash-специфичных конструкциях у них и правда есть — check-portability.awk Изначально был написан на шелле и позже переписан на awk'е, когда rillig@ понял, что «shell has a huge performance problem: When reading files, it calls read(2) for every single byte. awk instead reads a whole line at a time.» (перевожу: shell имеет кучу проблем с производительностью: так при чтении файла он вызывает read(2) для каждого байта, в то время как awk считывает потрочно).
Пока этот скрипт знает лишь про переменную $RANDOM, которой нет в POSIX и операторе сравнения ==, который понимают не все test'ы.
Кстати, ещё любопытный факт: на IRIX'ах отсутствует устройтво /dev/stderr и в POSIX вроде его тоже нет.
Вот такие открытия из мира Unix'ов я узнал и поделился с вами :)