Задать вопрос
Пользователь пока ничего не рассказал о себе

Достижения

Все достижения (1)

Наибольший вклад в теги

Все теги (14)

Лучшие ответы пользователя

Все ответы (12)
  • Как работает веб сервер?

    @vinca
    Поверхностно про сеть: ru.m.wikipedia.org/wiki/%D1%E5%F2%E5%E2%E0%FF_%EC%... - тут нужно уловить, что такое сигналы, что такое пакеты и что такое данные...

    Теперь, о том как пишется собственно сервер (приложение). ОС предоставляет 4-е системных вызова (про сетевую карту, драйвера и как ОС работает с erhernet не буду рассказыывать). Собственно системные вызовы:
    1) socket - создает сокет, для веб сервера, обычно это tcp;
    2) bind - привязывает сокет к локальному ip-адресу сервера (железки) и на определенный порт. Нужно из-за того, что на железке может быть много ip-адресов;
    3) listen - переводит сокет в состояние "слушать" (включает его на прием и передачу - если просто), это значит, что сокет готов принимать соединения от клиента (см tcp handshake) и ставить его в очередь ОС (очередь приложения backlog);
    4) accept - создает сокет к клиенту, позволяя уже с ним обмениваться данными. Accept вызывает само приложение, в зависимости от алгоритма, учитывая что есть ресурсы на обработку клиентского запроса. Если accept не сделать, то соединение повиснит в очереди (backlog) на время таймаута выставленного со стороны клиента или сервера.

    После accept, apache создает дочерний процесс, который уже и начинает из данных извлеченных из tcp "парсить" http по rfq (аля соглашению) и обрабатывать пользовательский запрос - разбирая зоголовки и выплевывая в сетевой буфер прочтенный с диска index.html с правильными заголовками http 1.0 или 1.1.
    Ответ написан
    Комментировать
  • Как назначать переменные некоторым словам строки в цикле bash?

    @vinca
    $ echo "var1:var2:var3" | tr ':' ' ' | while read a b c; do echo "$a / $b / $c"; done
    var1 / var2 / var3

    read умеет работать с несколькими переменными, разделенные пробелом, по этой причине нужно заменить ":" на " " (пробел) - например с помощью tr. Данная конструкция while read a b c, подойдет для фиксированного набора значений в строках файла ./file - в данном случае их 3-и, но Вы можете сделать больше. =)
    Ответ написан
    2 комментария
  • Как сразу убить процесс в Bash?

    @vinca
    1. $ sleep 1000
    2. CTR+z
    3. $ sleep 2000
    4. CTR+z
    5. $ jobs
    [1]- Stopped sleep 1000
    [2]+ Stopped sleep 2000
    6. $kill -9 %2 # обратите внимание на %2 - посылаем сигнал фоновому таску
    [2]+ Stopped sleep 2000
    7. $ jobs
    [1]- Stopped sleep 1000
    [2]+ Убито sleep 2000

    Если кратко - используйте набор утилит, для работы с фоновыми задачами: jobs, bg, fg.
    Отправляйте процесс в фон, используя комбинацию CTR+z, после чего Вы получите id задачи и далее id используете в утилите kill, для отсылки таску любого сигнала. В место pid процесса используйте в качестве аргумента id таска, сопровождая его процентом - % (см. пример 6).
    Ответ написан
    1 комментарий
  • Как отсечь нули в числе?

    @vinca
    Можно воспользоваться printf (с форматированием), по примеру printf в - который приведет к нужному формату числа:
    $ printf '%.2f\n' '27,970000'
    27,97
    $ printf '%.2f\n' '27,9'
    27,90
    $ printf '%.2f\n' '27'
    27,00

    Обратите внимание на запятую - Вам точку нужно заменить на запятую, например через sed или tr.

    Конкретно случай для Вас:
    $ echo "27,970000" > 1.txt # записываем в файл 1.txt значение 27,970000
    $ printf '%.2f\n' $(cat 1.txt) # читаем из файла 1.txt и приводим к формату %.2f
    27,97 # результат

    Точку заменить на запятую можно вот так:
    $ echo "27.970000" > 1.txt
    $ printf '%.2f\n' $(cat 1.txt | tr '.' ',')
    27,97
    Ответ написан
    6 комментариев