
以下のコマンドは、入力ファイル記述子のコピーを作成し、複製されたファイル記述子を使用してコマンドからecho
端末にデータを書き込みます。
sh-4.2$ 実行 6<&0 sh-4.2$ エコー "こんにちは" >&6 こんにちは
つまり、入力ファイル記述子を使用して端末に書き込むことができるということですか?
答え1
つまり、入力ファイル記述子を使用して端末に書き込むことができるということですか?
もちろんです。開いているファイル記述子を使用して、端末 (書き込みをサポートし、許可する任意のファイル、パイプ、デバイス、ソケット) に書き込むことができます。コードのよりシンプルなバージョンは次のようになります。
echo hello >&0
これは、予想どおり、ファイル記述子 0 が指すものに "hello\n" を送信します。それが端末であれば、それで構いません。
答え2
これは私の回答のコピーです同様の質問昨年、stackoverflow に投稿されました。
歴史的な慣習により、端末デバイスの標準入力に書き込むことができます。次のようなことが起こります:
ユーザーがUnix系システム上の端末にログインするか、X11で端末ウィンドウを開くと、ファイル記述子0、1、2が端末デバイスに接続され、それぞれが開かれます。読むことも書くことも. これは事実です通常はfd 0からのみ読み取り、fd 1と2に書き込むにもかかわらず。
コードはこちら第 7 版 init.c:
open(tty, 2);
dup(0);
dup(0);
...
execl(getty, minus, tty, (char *)0);
やり方は次のとおりですssh
:
ioctl(*ttyfd, TCSETCTTY, NULL);
fd = open("/dev/tty", O_RDWR);
if (fd < 0)
error("%.100s: %.100s", tty, strerror(errno));
close(*ttyfd);
*ttyfd = fd;
...
/* Redirect stdin/stdout/stderr from the pseudo tty. */
if (dup2(ttyfd, 0) < 0)
error("dup2 stdin: %s", strerror(errno));
if (dup2(ttyfd, 1) < 0)
error("dup2 stdout: %s", strerror(errno));
if (dup2(ttyfd, 2) < 0)
error("dup2 stderr: %s", strerror(errno));
(このdup2
関数は arg1 を arg2 に複製し、必要に応じてまず arg2 を閉じます。)
やり方は次のとおりですxterm
:
if ((ttyfd = open(ttydev, O_RDWR)) >= 0) {
/* make /dev/tty work */
ioctl(ttyfd, TCSETCTTY, 0);
...
/* this is the time to go and set up stdin, out, and err
*/
{
/* dup the tty */
for (i = 0; i <= 2; i++)
if (i != ttyfd) {
IGNORE_RC(close(i));
IGNORE_RC(dup(ttyfd));
}
/* and close the tty */
if (ttyfd > 2)
close_fd(ttyfd);