2

执行以下命令:

mysql -u root -p < load_data.sql > output.tab

-p标志告诉 mysql 客户端 - 一个 C 程序 - 为用户提供输入密码的交互式提示。

AFAIK,像这样的输入通常是通过写入提示stderr然后阻塞调用来处理的gets,它从标准输入读取一行。

但是shell已经打开了load_data.sql文件并将stdinmysql客户端的文件描述符设置为它的文件描述符——所以不应该调用gets只从文件中获取第一行吗?

我最初的想法是程序会在读取一行之前搜索到最后——但你不能在管道上搜索!

那么这是如何工作的呢?有什么魔法吗?

4

2 回答 2

3

提示输入密码的应用程序通常不会真正从标准输入中读取它们,因为这会 (a) 如果以交互方式输入密码会导致密码出现在屏幕上,并且 (b) 鼓励使用纯文本密码当事情需要自动化时(例如在其他人可以看到的命令行中ps通过 PostgreSQL 的psqlSQL shell 直接打开终端设备,我怀疑 mysql 也会这样做。

一些快速搜索发现了这个相关的问题。最受好评的答案提到了 GNU 函数getpass(),它确实打开了与终端的直接连接,绕过了标准输入。我怀疑这个函数是大多数密码提示程序在 *nix 中使用的。

于 2012-12-06T04:23:22.343 回答
0

这不是正在打开的管道,而是stdin指向文件的重定向。因此,您既有一个FILE*(即一个流),也有一个可以使用的普通文件描述符。在较低级别的文件描述符的情况下,您可以执行一些查找操作,例如lseek()等,可以与这些操作一起使用以read()在文件中移动。

如果您仍想在被重定向到stdin文件时从控制终端读取数据,您只需打开控制终端以读取另一个文件描述符。您可以使用ctermid()以确定您的进程的控制终端是什么,并在另一个文件描述符上重新打开它。

于 2012-12-06T04:11:09.657 回答