
아래 명령은 입력 파일 설명자의 복사본을 만들고 echo
명령의 데이터를 터미널에 쓰기 위해 중복된 파일 설명자를 사용합니다.
sh-4.2$ exec 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);