![리디렉션에 명령줄 인수 사용](https://linux55.com/image/84554/%EB%A6%AC%EB%94%94%EB%A0%89%EC%85%98%EC%97%90%20%EB%AA%85%EB%A0%B9%EC%A4%84%20%EC%9D%B8%EC%88%98%20%EC%82%AC%EC%9A%A9.png)
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
int val;
if(argc!=2)
{
printf("Usage: %s <descriptor> \n", argv[0]);
exit(1);
}
val=fcntl(atoi(argv[1]), F_GETFL, 0);
switch(val & O_ACCMODE)
{
case O_RDONLY:
printf("read only");
break;
case O_WRONLY:
printf("write only");
break;
case O_RDWR:
printf("read write");
break;
default:
printf("unknown access mode");
}
if(val & O_APPEND)
printf(", append");
if(val & O_NONBLOCK)
printf(", nonblocking");
if(val & O_SYNC)
printf(", synchronous writes");
putchar('\n');
exit(0);
}
이 코드가 있습니다. 어쨌든 소스는 완전히 이해 가능합니다.
그러나 명령줄 인수 및 리디렉션과 함께 프로그램을 사용하는 것에 대해 혼란스럽습니다.
이 프로그램을 사용해 본 결과는 다음과 같습니다
$ ./a.out 0 < /dev/tty
read only
$ ./a.out 1 > temp.foo
$ cat temp.foo
write only
$ ./a.out 2 2>>temp.foo
write only, append
$ ./a.out 5 5<>temp.foo
read write
리디렉션을 수행하는 방법을 알고 있지만 명령줄 인수와 함께 이 기술을 사용하는 것은 매우 혼란스럽습니다. 나는 아무것도 모른다.
글쎄요, 제가 아는 한, 이 프로그램에는 파일 설명자라는 매개변수가 1개 있습니다.
그래서 이 프로그램을 사용하면
$ ./a.out 0
read write
$ ./a.out 1
read write
$ ./a.out 2
read write
좋아요. stdin, stdout, stderr 파일 상태는 입니다 read write
.
하지만 리디렉션을 위해 이 명령을 사용할 때. 어떤 메커니즘이 무엇을 하고 있는지 모릅니다.
예를 들어:
./a.out 0 < /dev/tty
여기서 /dev/tty
파일은 이제 표준 입력과 동일합니다. 그렇다면 /dev/tty
0은 정확히 무엇을 의미합니까?
리디렉션을 사용할 때 와 의 차이점은 무엇 입니까 &2
?&1
2
1
답변1
리디렉션을 수행하는 방법을 알고 있지만 명령줄 인수와 함께 이 기술을 사용하는 것은 매우 혼란스럽습니다. 나는 아무것도 모른다.
정확히 무엇이 당신을 혼란스럽게 하는지 자세히 설명해주세요. 나에게 결과는 예상했던 것과 거의 같습니다. 파일 객체가 읽기 전용으로 열린 경우(예: "<" 리디렉션) F_GETFL은 O_RDONLY를 제공합니다. 다른 유형의 리디렉션에도 마찬가지입니다.
리디렉션이 없으면 하위 명령은 상위 명령과 동일한 표준 설명자를 얻습니다. 사용자 터미널인 일반적인 상호 작용 상황에서는 모든 설명자를 읽고 쓸 수 있습니다. 읽기 전용, 쓰기 전용 등으로 만들기로 결정하는 것은 curses
터미널 입력을 위해 0으로 분할하는 것보다 대화형 터미널 활동(예: 사용된 전체 화면 활동)에 동일한 설명자를 사용하는 것이 더 편리하기 때문에 쓸모가 없습니다. 터미널 출력 등을 위한 터미널 입력의 경우. 그러나 이는 사용자가 지정한 리디렉션으로 확장되지 않습니다. 그게 당신이 묻는 것인가요?
리디렉션을 사용할 때 &2,&1과 2,1의 차이점은 무엇입니까?
2>1
및 와 같은 형식을 의미하는 경우 2>&1
주로 다릅니다. 2>1
파일에 쓰려면 2를 리디렉션하세요 1
. 2>&1
2를 설명자 1의 복사본으로 리디렉션합니다(C 수준에서는 dup2(1,2)
). 숫자 n과 m의 경우 동일하며 액세스 패턴에 제한을 추가하지 않습니다 n<&m
.n>&m