Почему приложения Mac никогда не “закрываются”?

Мощность буфера канала варьируется через системы (и может даже варьироваться в той же системе). Я не уверен, что существует быстрый, легкий, и кросс-платформенный путь только к поиску способность канала.

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.  */

61
07.03.2011, 00:17
6 ответов

В некотором смысле это - конвенция 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, и ни один не "доказуемо корректен". Но, миграция далеко от чего-то полезного как этот, без любого серьезного основания просто не имела бы никакого смысла. Хотелось бы надеяться, этот тур через часть истории дает Вам немного контекста, который Вы находите полезными.

89
27.01.2020, 19:32
  • 1
    : NeXTSTEP не использовал X11. Это имело свою собственную работу с окнами на основе PostScript Дисплея (который в конечном счете сформировал основание 2D Кварца OS X, хотя на основе PDF, а не PS). –  gsnedders 21.07.2016, 01:05
  • 2
    Кроме они все подражали Альту ксерокса. Задания и Gates оба даже сказали так буквально. И X11/Motif был на основе в основном всех их. –  Evi1M4chine 03.10.2016, 23:02
  • 3
    Apple Ответа дает разработчикам выбор выхода из приложения после того, как последнее окно закроется. Это до разработчиков, делают тот выбор. По-видимому, многие разработчики предпочитают создавать свои приложения как этот. –  SpaceDog 01.11.2016, 19:38

Окно не является приложением в MacOS в MacOS подключения окон к приложению. Именно поэтому приложение не выходит, когда Вы закрываете окно.

В Windows окно является приложением, именно поэтому приложение должно выйти при нажатии кнопки выхода.

На Linux разработчик решает, какую архитектуру им нравится использовать, оба пути возможно...

20
27.01.2020, 19:32
  • 1
    В Windows, оба пути возможны, также... –  Chris Down 30.01.2012, 16:24
  • 2
    И если Вы используете Какао для создания приложений, можно выбрать, выходит ли приложение, когда последнее окно закрывается. –  Blacklight Shining 07.10.2012, 13:48
  • 3
    Кроме того, Установки системы выходит, когда его окно закрывается. (Могут быть другие связанные приложения, которые делают это, но это - единственное, о котором я могу думать в данный момент.) –  Blacklight Shining 07.10.2012, 13:57
  • 4
    @ChrisDown: Как можно было бы взаимодействовать с приложением без окна в Windows? Системный докер? –  Evi1M4chine 03.10.2016, 23:09

Это специализировано. Например, приложение Установок системы действительно выходит при нажатии на красную кнопку. Однако большинство программ только закрывает окно (и документы в), когда Вы пытаетесь "закрыть" его. Я предполагаю, что идея позади этого состоит в том, чтобы сделать вещи быстрее, когда Вы хотите использовать приложение снова.

Если я хочу закрыться, я хочу закрыться. Период.

Я соглашаюсь, таким образом, я использую сочетания клавиш, Cmd+w для того, чтобы закрыть окно и Cmd+q для того, чтобы действительно выйти. Большинству приложений реализовали это. Альтернатива должна щелкнуть правой кнопкой по значку приложения и выбрать "Quit", который намного медленнее.

15
27.01.2020, 19:32

Да, это очень, очень раздражающее.

Между тем это приложение должно помочь:
http://www.carsten-mielke.com/redquits.html

Из описания:

Вы когда-либо пытались закрыть приложение с его красной кнопкой и задавались вопросом, почему это все еще открыто? RedQuits изменяет это. Все программы теперь выходят и закрывают все открытые окна при нажатии красной кнопки.

8
27.01.2020, 19:32
  • 1
    Интересное решение. –  Somebody still uses you MS-DOS 04.10.2011, 22:02
  • 2
    , которые используют это обходное решение, должен, вероятно, переключиться на Windows или изучить философию OS X выполнения вещей. Я не хочу запускать войну пламени здесь, но это обычно применяется каждый раз, когда кто-то хочет вести себя продукт как другой. Хорошо, что инструмент существует. Существует, вероятно, несколько человек, которые используют его. –  Rafael Bugajewski 17.07.2015, 15:04
  • 3
    И это - единственное корректный ответ, СПАСИБО @Tamas! Правило состоит в том, что компьютер и программное обеспечение должны быть гибкими и соответствовать моим потребностям и привычкам - не противоположный путь! –  Marecky 09.11.2015, 18:49

Причина этого происходит из-за того, что является окном. В 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

3
27.01.2020, 19:32
  • 1
    я получил его после нескольких месяцев.:) На самом деле оба подхода имеют смысл. –  Somebody still uses you MS-DOS 08.11.2012, 01:12

Вначале я думал, что это - также плохая идея, но действительно - теперь я думаю, что это является потрясающим. На самом деле мне не нравится то глупое поведение, которое "X" завершает приложение. Очень важно отметить, что это - намного лучший подход для основанных на документах приложений, таких как Photoshop или Редакторы документов, на самом деле - теперь я всегда забываю помнить, что "X" завершает приложение (такое как Photoshop), и затем я должен провести дополнительное время на инициализации. Приложение просто там ожидает Ваших новых документов, почему я должен завершить его? Хорошо - это - пожиратель ресурсов памяти, но в наше время RAM является столь дешевой, что она не имеет значения вообще.

0
27.01.2020, 19:32

Теги

Похожие вопросы