입력 파일 설명자를 복제하여 데이터 쓰기에 사용할 수 있나요?

입력 파일 설명자를 복제하여 데이터 쓰기에 사용할 수 있나요?

아래 명령은 입력 파일 설명자의 복사본을 만들고 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);

관련 정보