Открытие файла устройства с помощью erlang - PullRequest
6 голосов
/ 23 декабря 2010

Есть ли способ открыть файл терминального устройства в erlang?

Я на Солярисе и пытаюсь сделать следующее:

Erlang (BEAM) emulator version 5.6 [source] [64-bit] [async-threads:0] [kernel-poll:false]

/xlcabpuser1/xlc/abp/arunmu/Dolphin/ebin
Eshell V5.6  (abort with ^G)
1> file:open("/dev/pts/2",[write]).
{error,eisdir}
2> file:open("/dev/null",[write]).
{ok,}
3>

Как видно выше, драйвер файла erlang не имеет проблем с открытием нулевого файла, но не открывает файл устройства терминала !!

Невозможно прийти к выводу, так как файловый драйвер может открыть нулевой файл.

Есть ли другой способ открыть файлы устройства терминала?

Спасибо

1 Ответ

9 голосов
/ 24 декабря 2010

Обновление : я смог обойти ограничение, описанное ниже, используя порт. Например, вот пример программы, которая выводит «hello world» в /dev/stdout:

-module(test).
-export([main/1]).

main(X) ->
    P = open_port({spawn, "/bin/cat >/dev/stdout"}, [out]),
    P ! {self(), {command, "hello world"}}.

Это немного неудобно, потому что порт не действует как обычный файл, но, по крайней мере, это один из способов выполнить работу.


В efile_openfile()erts/emulator/drivers/unix/unix_efile.c) есть следующий код:

    if (stat(name, &statbuf) >= 0 && !ISREG(statbuf)) {
#if !defined(VXWORKS) && !defined(OSE)
        /*
         * For UNIX only, here is some ugly code to allow
         * /dev/null to be opened as a file.
         *
         * Assumption: The i-node number for /dev/null cannot be zero.
         */
        static ino_t dev_null_ino = 0;

        if (dev_null_ino == 0) {
            struct stat nullstatbuf;

            if (stat("/dev/null", &nullstatbuf) >= 0) {
                dev_null_ino = nullstatbuf.st_ino;
            }
        }
        if (!(dev_null_ino && statbuf.st_ino == dev_null_ino)) {
#endif
            errno = EISDIR;
            return check_error(-1, errInfo);
#if !defined(VXWORKS) && !defined(OSE)
        }
#endif
    }

Этот код (сбивает с толку) возвращает ошибку EISDIR, если файл не является обычным файлом (который является проверкой ISREG(statbuf)), , если файл специально не является /dev/null. Документация file(3) гласит:

     eisdir :
       The named file is not a regular file. It  may  be  a  directory,  a
       fifo, or a device.

так что на самом деле это задокументировано. Я не уверен, почему существует такое ограничение, хотя & mdash; возможно, это как-то связано с производительностью, поскольку драйверы устройств могут блокироваться дольше, чем обычный файл.

...