![입력 파일 설명자를 복사하여 데이터를 쓰는 데 사용할 수 있나요?](https://linux55.com/image/101181/%EC%9E%85%EB%A0%A5%20%ED%8C%8C%EC%9D%BC%20%EC%84%A4%EB%AA%85%EC%9E%90%EB%A5%BC%20%EB%B3%B5%EC%82%AC%ED%95%98%EC%97%AC%20%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC%20%EC%93%B0%EB%8A%94%20%EB%8D%B0%20%EC%82%AC%EC%9A%A9%ED%95%A0%20%EC%88%98%20%EC%9E%88%EB%82%98%EC%9A%94%3F.png)
다음 명령은 입력 파일 설명자를 복사하고 복사된 파일 설명자를 사용하여 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);