[Tarantool-patches] [PATCH] fio: provide access to stdin/stdout/stderr

Vladislav Shpilevoy v.shpilevoy at tarantool.org
Sun Apr 26 20:47:24 MSK 2020


Hi! Thanks for the patch!

On 04/04/2020 11:53, olegrok at tarantool.org wrote:
> From: Oleg Babin <babinoleg at mail.ru>
> 
> This patch introduces fio API for interaction with
> stdin/stdout/stderr streams.
> 
> Closes #1338
> 
> @TarantoolBot document
> Title: fio provides access to stdin/stdout/stderr
> 
> Now access to standard streams is available via:
>   * fio.stdin
>   * fio.stdout
>   * fio.stderr
> 
> Each of this streams have usual fio file interface.
> 
> Example:
> ```lua
> fio.stdin:read(5) -- read 5 bytes from stdin

I tried these examples:

1. Start interactive console, call fio.stdin:read(5). When
I type any character, read() returns immediately, with 1
byte read. Not 5.

2. I tried starting Tarantool from a script, without the
console. In the script I did essentially the same - call
fio.stdin:read(5), print result, exit. It returned only
what I inserted until \n or 5 symbols, if I didn't print
\n.

Why?

> fio.stdout:write("Hello") -- write "Hello" to stdout
> fio.stderr:write("Error") -- write "Error" to stderr
> ```
> ---
> Issue: https://github.com/tarantool/tarantool/issues/1338
> Branch: https://github.com/tarantool/tarantool/tree/olegrok/1338-fio-std-streams
> 
> @ChangeLog
>   - fio provides access to stdin/stdout/stderr (gh-1338)
> 
>  src/lua/fio.lua       | 10 ++++++++++
>  test/app/fio.result   | 27 +++++++++++++++++++++++++++
>  test/app/fio.test.lua | 11 +++++++++++
>  3 files changed, 48 insertions(+)
> 
> diff --git a/src/lua/fio.lua b/src/lua/fio.lua
> index 83fddaa0a..1eaa085ae 100644
> --- a/src/lua/fio.lua
> +++ b/src/lua/fio.lua
> @@ -522,6 +528,10 @@ fio.utime = function(path, atime, mtime)
>      return internal.utime(path, atime, mtime)
>  end
>  
> +fio.stdin = ffi.new('struct fio_handle', filenos.STDIN)
> +fio.stdout = ffi.new('struct fio_handle', filenos.STDOUT)
> +fio.stderr = ffi.new('struct fio_handle', filenos.STDERR)

The problem is that when Tarantool will be terminated, Lua
is destroyed (probably it is disabled now, but I think will be
enabled at some day). Anyway, destruction of these handles leads
to closure of their descriptors, since fio handles now are
automatically closed when GC gets to them. That makes all printf(),
scanf(), fscanf(), etc, work with invalid descriptors, or even
already newly opened descriptors, not related to the standard
streams which took their place.

Better use dup() so as close of these descriptors wouldn't affect
other code.


More information about the Tarantool-patches mailing list