Мощность буфера канала варьируется через системы (и может даже варьироваться в той же системе). Я не уверен, что существует быстрый, легкий, и кросс-платформенный путь только к поиску способность канала.
Mac OS X, например, использует мощность 16 384 байтов по умолчанию, но может переключиться на 65 336-байтовые мощности, если большая запись сделана к каналу или переключится на мощность страницы единой системы, если слишком много памяти ядра уже используется буферами канала (см. xnu/bsd/sys/pipe.h
, и xnu/bsd/kern/sys_pipe.c
; так как это из FreeBSD, то же поведение может произойти там, также).
Один канал Linux (7) в странице справочника говорится, что способность канала составляет 65 536 байтов начиная с Linux 2.6.11 и страницы единой системы до того (например, 4 096 байтов в (32-разрядных) x86 системах). Код (include/linux/pipe_fs_i.h
, и fs/pipe.c
) кажется, использует 16 системных страниц (т.е. 64 кибибайта, если системная страница составляет 4 кибибайта), но буфер для каждого канала может быть скорректирован через fcntl на канале (до максимальной способности, через какие значения по умолчанию к 1 048 576 байтам, но может быть изменен /proc/sys/fs/pipe-max-size
)).
Вот немного bash/perl комбинации, что я раньше тестировал способность канала в моей системе:
#!/bin/bash
test $# -ge 1 || { echo "usage: $0 write-size [wait-time]"; exit 1; }
test $# -ge 2 || set -- "$@" 1
bytes_written=$(
{
exec 3>&1
{
perl -e '
$size = $ARGV[0];
$block = q(a) x $size;
$num_written = 0;
sub report { print STDERR $num_written * $size, qq(\n); }
report; while (defined syswrite STDOUT, $block) {
$num_written++; report;
}
' "$1" 2>&3
} | (sleep "$2"; exec 0<&-);
} | tail -1
)
printf "write size: %10d; bytes successfully before error: %d\n" \
"$1" "$bytes_written"
Вот то, что я нашел выполнение его с различными размерами записи на Mac OS X 10.6.7 системами (обратите внимание на изменения для записей, больше, чем 16 кибибитов):
% /bin/bash -c 'for p in {0..18}; do /tmp/ts.sh $((2 ** $p)) 0.5; done'
write size: 1; bytes successfully before error: 16384
write size: 2; bytes successfully before error: 16384
write size: 4; bytes successfully before error: 16384
write size: 8; bytes successfully before error: 16384
write size: 16; bytes successfully before error: 16384
write size: 32; bytes successfully before error: 16384
write size: 64; bytes successfully before error: 16384
write size: 128; bytes successfully before error: 16384
write size: 256; bytes successfully before error: 16384
write size: 512; bytes successfully before error: 16384
write size: 1024; bytes successfully before error: 16384
write size: 2048; bytes successfully before error: 16384
write size: 4096; bytes successfully before error: 16384
write size: 8192; bytes successfully before error: 16384
write size: 16384; bytes successfully before error: 16384
write size: 32768; bytes successfully before error: 65536
write size: 65536; bytes successfully before error: 65536
write size: 131072; bytes successfully before error: 0
write size: 262144; bytes successfully before error: 0
Тот же сценарий на Linux 3.19:
/bin/bash -c 'for p in {0..18}; do /tmp/ts.sh $((2 ** $p)) 0.5; done'
write size: 1; bytes successfully before error: 65536
write size: 2; bytes successfully before error: 65536
write size: 4; bytes successfully before error: 65536
write size: 8; bytes successfully before error: 65536
write size: 16; bytes successfully before error: 65536
write size: 32; bytes successfully before error: 65536
write size: 64; bytes successfully before error: 65536
write size: 128; bytes successfully before error: 65536
write size: 256; bytes successfully before error: 65536
write size: 512; bytes successfully before error: 65536
write size: 1024; bytes successfully before error: 65536
write size: 2048; bytes successfully before error: 65536
write size: 4096; bytes successfully before error: 65536
write size: 8192; bytes successfully before error: 65536
write size: 16384; bytes successfully before error: 65536
write size: 32768; bytes successfully before error: 65536
write size: 65536; bytes successfully before error: 65536
write size: 131072; bytes successfully before error: 0
write size: 262144; bytes successfully before error: 0
Примечание: PIPE_BUF
значение определило в заголовочных файлах C (и pathconf оценивают за _PC_PIPE_BUF
), не указывает способность каналов, но максимальное количество байтов, которые могут быть записаны атомарно (см. запись POSIX (2)).
Кавычка от include/linux/pipe_fs_i.h
:
/* Differs from PIPE_BUF in that PIPE_SIZE is the length of the actual
memory allocation, whereas PIPE_BUF makes atomicity guarantees. */
В некотором смысле это - конвенция UI с историей, которая возвращается полностью к 1984. Начиная с Windows и X11 оба сообщения датируют исходный Mac GUI, можно было бы сказать, что Windows делает это Windows путь "только, чтобы отличаться" вместо того, чтобы предположить, что Mac является чудаком.
Назад в самые ранние дни Macintosh, Вы могли только запустить одно приложение за один раз. Было совершенно разумно для приложения открыться без окон, потому что приложение всегда имело видимую строку меню наверху экрана. Когда Вы закрыли все окна приложения, имело смысл сохранять приложение открытым, потому что Вы могли всегда использовать строку меню, чтобы создать новый документ или открыть существующий. Выход из процесса просто, потому что окно закрылось, не имел никакого смысла в то время, потому что не будет никакого другого процесса для уступки фокуса.
Несколько лет на, Macintosh конца 80-х, усовершенствованных до такой степени, когда, были достаточной памятью, чтобы иметь несколько приложений, открытых сразу. Так как инструменты для того, чтобы сделать это должны были сохранить назад совместимость с существующими приложениями, они естественно не собирались изменять основные конвенции UI и идти, уничтожая приложения без любых открытых окон. Результатом было чистое различие в UI между визуальным элементом GUI (окно) и абстрактным рабочим процессом (приложение).
Между тем Microsoft разрабатывала Windows. К началу 90-х Microsoft имела Windows 3. X, работающий хорошо, и Мотив на X11 был в большой степени вдохновлен работой Microsoft. В то время как Macintosh был создан вокруг представления UI Приложений, Windows (как имя предположит), был создан вокруг философии, что само Окно должно быть основной единицей UI с единственным понятием приложения, являющегося в форме контейнерных окон стиля MDI. X11 также рассмотрел заявление, в основном неважное с точки зрения UI. Единственный процесс мог даже открыть окна на нескольких дисплеях, подключенных к нескольким машинам через (очень новомодную) локальную сеть.
Проблема с подходом стиля Windows состояла в том, что Вы не могли сделать некоторых форм взаимодействия с пользователем, таких как открытие только с строкой меню, и у пользователя не было реальной гарантии, что процесс на самом деле вышел, когда окна закончились. Пользователь Macintosh мог легко переключиться на приложение, которое работало без окон, чтобы выйти из него или использовать его, но Windows не обеспечил абсолютно никакого способа для пользователя взаимодействовать с таким процессом. (Кроме заметить его в диспетчере задач и уничтожить его.) Кроме того, пользователь не мог принять решение оставить выполнение процесса так, чтобы они могли возвратиться к нему, не повторно запуская его, кроме сохранить некоторый видимый UI от процесса, загромождающего экран и использующего (в то время, очень ограниченный) ресурсы. В то время как Macintosh имел меню "Applications" для переключения, Windows популяризировал "панель задач", которая отобразила все высокоуровневые окна без любого отношения к процессу, который открыл их. Для тяжелых организаторов многозадачного режима "суп панели задач" оказался громоздким. Для более рядовых пользователей upredictability о том, что точно квалифицировало, поскольку "высокоуровневое окно" иногда сбивало с толку, поскольку не было никакого learnable правила о точно, которое окна на самом деле разоблачат на панели.
К концу 90-х GUI Microsoft был обычно используется. У большинства пользователей есть Windows PC, а не Macintosh или рабочая станция UNIX X11. Следовательно, поскольку Linux становился все популярнее со временем, многие разработчики происходили из среды использования конвенций Windows UI, а не UNIX конвенции UI. Это объединилось с историей ранней работы над вещами как рисунок Мотива из конвенций Windows UI, для приведения к современным настольным средам Linux, ведущим себя намного больше как Windows, чем классические вещи X11 как twm или Macintosh.
На данном этапе "классический" Mac OS выполнил свой курс с Mac OS 9, и Macintosh стал приводимой в действие машиной Unix с совсем другими кишками в форме Mac OS X. Таким образом это наследовало понятие NeXT UI Прикрепления. На исходных машинах NeXT X11 использовался, но с довольно уникальным набором конвенций UI и виджетов. Вероятно, самым отличительным из них было Прикрепление, которое было своего рода средством запуска программы комбинации и переключателем задачи. ("Многостолбцовое" открытое диалоговое окно файла, которое известно в OS X также, прибыло из Затем, а также некоторые другие видимые вещи. Старшие значащие изменения в переходе OS X были всеми невидимыми, все же.) Прикрепление работало хорошо с понятием Macintosh "Приложения как фундаментальный элемент UI". Так, пользователь видел, что приложение открыто меткой на значке панелей и переключателем к ней, или запустите ее путем нажатия на нее. Так как современный OS X теперь поддерживал многозадачность настолько лучше, чем классический Mac OS имел, это внезапно имело смысл, что пользователь мог бы хотеть иметь все виды вещей, работающих в фоновом режиме, такие как некоторое видео программное обеспечение преобразования, которое проворачивает далеко в фоновом режиме, устройство записи экрана, программное обеспечение VOIP, интернет-Радио, веб-сервер, что-то, что говорит в ответ на речевую команду и т.д. Ничего подобного не наполняет, обязательно требует, чтобы видимое окно было открыто, чтобы все еще сделать, чтобы разумный пользователь испытал, и строка меню была все еще отдельной от окон наверху экрана, и у Вас могло быть меню непосредственно на значке панелей, таким образом, пользователь мог всегда взаимодействовать с программой, которая имела, не открывают UI. следовательно, отказ от существующей конвенции хранения открытого приложения, только чтобы больше быть похожим на Windows, рассматривался бы большинством пользователей Mac как ужасный шаг в неправильном направлении. Это делает несколько режимов из взаимодействия невозможными без реальной выгоды.
Очевидно, некоторые пользователи предпочитают конвенцию Windows, и ни один не "доказуемо корректен". Но, миграция далеко от чего-то полезного как этот, без любого серьезного основания просто не имела бы никакого смысла. Хотелось бы надеяться, этот тур через часть истории дает Вам немного контекста, который Вы находите полезными.
Окно не является приложением в MacOS в MacOS подключения окон к приложению. Именно поэтому приложение не выходит, когда Вы закрываете окно.
В Windows окно является приложением, именно поэтому приложение должно выйти при нажатии кнопки выхода.
На Linux разработчик решает, какую архитектуру им нравится использовать, оба пути возможно...
Это специализировано. Например, приложение Установок системы действительно выходит при нажатии на красную кнопку. Однако большинство программ только закрывает окно (и документы в), когда Вы пытаетесь "закрыть" его. Я предполагаю, что идея позади этого состоит в том, чтобы сделать вещи быстрее, когда Вы хотите использовать приложение снова.
Если я хочу закрыться, я хочу закрыться. Период.
Я соглашаюсь, таким образом, я использую сочетания клавиш, Cmd+w для того, чтобы закрыть окно и Cmd+q для того, чтобы действительно выйти. Большинству приложений реализовали это. Альтернатива должна щелкнуть правой кнопкой по значку приложения и выбрать "Quit", который намного медленнее.
Да, это очень, очень раздражающее.
Между тем это приложение должно помочь:
http://www.carsten-mielke.com/redquits.html
Из описания:
Вы когда-либо пытались закрыть приложение с его красной кнопкой и задавались вопросом, почему это все еще открыто? RedQuits изменяет это. Все программы теперь выходят и закрывают все открытые окна при нажатии красной кнопки.
Причина этого происходит из-за того, что является окном. В Microsoft Windows каждое приложение получает свое собственное окно, где в MAC OSX и предыдущих релизах Mac OS каждый файл или документ имеют свое собственное окно. "При закрытии Safari", Вы не закрываетесь [выход] из Safari приложения, но просто закрытие файла (http://unix.stackexchange.com). Аналогично, если Вы закрываете окно Страниц (приложение текстового редактора Apple), Вы закрываете документ, что Вы продолжали работать, но страницы приложения все еще работают. Если Вы хотите выйти из приложения, затем используют CMD+Q. Некоторые non-file-creation приложения следуют за этим шаблоном, поскольку они могут иметь несколько открытых окон или ни один в весь и все еще функционировать (iTunes).
Альтернативные шаги: Нажмите CMD+Q для выхода из приложения вместо закрывают окно [CMD+W] Вторичный щелчок по значку на прикреплении (CTRL+Click или правая кнопка мыши или два касания пальца на мыши сенсорной панели/волшебства) и принимают решение выйти из того пути.
Печально это - всего одна небольшая вещь, которую нужно сделать, чтобы забыть Windows и думать Mac :D
Вначале я думал, что это - также плохая идея, но действительно - теперь я думаю, что это является потрясающим. На самом деле мне не нравится то глупое поведение, которое "X" завершает приложение. Очень важно отметить, что это - намного лучший подход для основанных на документах приложений, таких как Photoshop или Редакторы документов, на самом деле - теперь я всегда забываю помнить, что "X" завершает приложение (такое как Photoshop), и затем я должен провести дополнительное время на инициализации. Приложение просто там ожидает Ваших новых документов, почему я должен завершить его? Хорошо - это - пожиратель ресурсов памяти, но в наше время RAM является столь дешевой, что она не имеет значения вообще.