Фэндом


file2chan - простая и удобная функция для создания синтетических файлов. Смотрите страницы руководства file2chan(2) и sh-file2chan(1) для деталей.

На удаленной машине:

  1. Наберите svc/net для запуска сетевых сервисов
  2. Смените каталог на ваш домашний (например /usr/john)
  3. Наберите load file2chan для загрузки модуля file2chan
  4. Выполните file2chan oschan {} { os uname } . Эта команда создаст синтетический файл oschan (который вы сможете увидеть набрав ls). Первая пустая пара фигурных скобок означает что при чтении этого "файла" ничего не произойдет. Вторая пара скобок означает что запись чего-либо в файл приведет к тому что будет выполнена команда os uname.
  5. Попробуйте выполнить - echo rubbish > oschan . Вы должны увидеть название вашей основной операционной системы (в случае использование Unix-подобной ОС. прим. пер.)

На локальной машине:

  1. Наберите svc/net для запуска сетевых сервисов
  2. Смонтируйте пространство имен удаленной машины: mount mymachine.somewhere.com /n/remote.
  3. Перейдите в директорию содержащую синтетический файл на удаленной машине: cd /n/remote/usr/john. Наберите ls для того чтобы увидеть "файл" названный oschan.
  4. Запишите что-нибудь в файл: echo blah-blah > oschan.
  5. На локальной машине ничего не произошло! Однако на удаленной появился вывод команды "os uname".

Таким образом мы можем выполнять процессы на удаленной машине, но мы не получили вывод от команды на нашей локальной машине. Для того чтобы это сделать нам потребуется написать программу на языке Limbo с использованием функции file2chan и сделать так, чтобы вывод был перенаправлен обратно клиенту.

Приведенный ниже код был опубликован в "Dr. Dobb's Journal" и демонстрирует использование функции file2chan. Программа создает синтетический файл "server.html", который заново генерируется всякий раз при его чтении.

Источник: http://www.ddj.com/architect/184404356

implement SimpleFileServer;
include "sys.m";
include "draw.m";
include "daytime.m";

sys     : Sys;
draw    : Draw;
daytime : Daytime;

SimpleFileServer : module
{
        init : fn(ctxt : ref Draw->Context, args : list of string);
};

chanref : ref sys->FileIO;
init(ctxt : ref Draw->Context, args : list of string)
{
        sys = load Sys Sys->PATH;
        sys->print("Server - Initialising...\n");
        sys->bind("#s", "/usr/pip", sys->MBEFORE);

        chanref = sys->file2chan("/usr/pip", "server.html");

        if (chanref == nil)
        {
           sys->print("Server - Could not create chan  file : %r\n");
        }
        spawn worker();
}
worker ()
{

        data    : array of byte;
        index   : int = 0;
        while (1)
        alt
        {
                (off, nbytes, fid, rc) := <-chanref.read =>
                {
                        if (rc == nil) break;
                        ## Это новое чтение. Генерируем новую страницу
                        if (index == 0)
                        {
                                data = gendata();
                        }
                        ## len возвращает количество байт в массиве array of bytes,
                        ## число юникодных символов в строке или
                        ## число элементов в списке
                        if (index < len data)
                        {
                                end := min(index+nbytes, len data);
                                ## Отдаем читающему данные которые еще остались
                                rc <-= (data[index:end], "");
                                index = end;
                        }
                        else
                        {
                                ## Завершаем отдачу содержимого массива data[]
                                rc <-= (nil, "");
                                ## Таким образом, следующее чтение данных будет снова запустит цикл
                                index = 0;
                        }
                }
                (offset, writedata, fid, wc) := <-chanref.write =>
                {
                        if (wc == nil)
                        {
                                break;
                        }
                        wc <-= (len writedata, "");
                }
        }
}
gendata () : array of byte
{
        daytime = load Daytime Daytime->PATH;
        head := "<HTML><HEAD><TITLE>Generated HTML</TITLE></HEAD>\n";
        top  := "<BODY><CENTER><H1>Dynamically Generated</H1></CENTER>\n";
        body := daytime->time() + "\n";
        tail := "</BODY></HTML>\n";
        return array of byte (head+top+body+tail);
}
min (a, b : int) : int
{
        if (a < b)
                return a;
        return b;
}

Обнаружено использование расширения AdBlock.


Викия — это свободный ресурс, который существует и развивается за счёт рекламы. Для блокирующих рекламу пользователей мы предоставляем модифицированную версию сайта.

Викия не будет доступна для последующих модификаций. Если вы желаете продолжать работать со страницей, то, пожалуйста, отключите расширение для блокировки рекламы.

Также на Фэндоме

Случайная вики