Обновление : я смог обойти ограничение, описанное ниже, используя порт. Например, вот пример программы, которая выводит «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; возможно, это как-то связано с производительностью, поскольку драйверы устройств могут блокироваться дольше, чем обычный файл.