Не каждый процесс оболочки, только вход в систему оболочка создает новый сеанс (подробнее ниже ). Очевидно, что вначале сеанс имеет только одного члена — саму оболочку. Каждый новый разветвленный процесс автоматически принадлежит одному и тому же сеансу. Процесс может удалить себя из своего сеанса, создав новый с помощью setsid()
. У процесса нет другого способа изменить свою сессию.
Резюме:
session members = login shell AND all child processes (and their child processes, etc.) EXCEPT child processes that have created its own sessions
Остается вопрос, всегда ли все процессы, порожденные оболочкой, запускаются как «задания», то есть одна группа процессов на команду. Хотя это обычно верно, я не знаю наверняка для интерактивных оболочек -.
ОБНОВЛЕНИЕ
Этот вопрос касался bash
, но то же самое можно сказать и о других подобных оболочках, ориентированных на командную строку, с управлением заданиями.
Как указал @StéphaneChazelas, сеанс создается программой, которая управляет входом в систему на терминале или псевдотерминальном устройстве. Сессия строго привязана к своему терминалу.
Сначала пользователь должен войти в систему, и только после этого его или ее программа-оболочка может быть определена по соответствующей записи в файле passwd
.Эта программа оболочки получает exec
ed -PID остается прежним. Таким образом, сеанс создается внутри процесса, который становится оболочкой входа пользователя.
Chrome продолжает работать с первой версией команды, потому что он не знает, насколько велик отправляемый файл, поэтому он не знал, когда он получил его весь, пульсация означает, что он все еще ждет, чтобы увидеть, есть ли больше нет.
Вторая версия добавляет HTTP-заголовок с размером полезной нагрузки перед содержимым файлов, поэтому Chrome теперь знает, сколько еще данных он ожидает, и помечает транзакцию как завершенную, когда достигается конец файла.
nc
в сочетании с HTTP/1.0 200 OK\r\n
реализует АБСОЛЮТНЫЙ минимальный минимум (на самом деле это не так, но приходит очень щедро в том, что он принимает )протокола HTTP требует что-то отправить, добавляя Content-Length
ходы чуть ближе к спец. Протокол HTTP хорошо документирован, я предлагаю вам прочитать rfc
РЕДАКТИРОВАТЬ:
some.file
note
вместоnot
В HTTP/1.0, если заголовок Content -Length отсутствует в ответе, вместо этого конец ответа указывается закрытием сокета. nc
не делает этого по умолчанию, поэтому хром (или любой другой браузер )ждет ("пульсирует" )"вечно", чтобы это произошло.
Добавьте параметр -N
в nc
в первой команде, и все должно работать нормально:
{ echo -ne "HTTP/1.0 200 OK\r\n\r\n"; cat some.file; } | nc -N -l -p 8080
Обратите внимание, что заголовок Content -Length не требуется в HTTP/1.0(rfc1945, раздел 7.2.2 ), за исключением случаев, когда ожидается тело и оно пусто (, раздел 7.2).
URL-адрес http://IP:8080/
заставляет браузер отправлять что-либо после IP-адреса и порта на сервер, в данном случае только последний /
как указание на то, что он хочет от сервера. В примере команд nc/
(или что-то еще ), отправленное браузером, полностью игнорируется, и ответ всегда один и тот же. Таким образом, вы можете использовать http://IP:8080/hello/world.png
с тем же результатом.