다음 명령은 입력 파일 설명자를 복사하고 복사된 파일 설명자를 사용하여 echo
명령의 데이터를 터미널에 씁니다.
sh-4.2$ 실행 6<&0 sh-4.2$ echo "안녕하세요">&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);