리디렉션에 명령줄 인수 사용

리디렉션에 명령줄 인수 사용
#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/tty0은 정확히 무엇을 의미합니까?

리디렉션을 사용할 때 와 의 차이점은 무엇 입니까 &2?&121

답변1

리디렉션을 수행하는 방법을 알고 있지만 명령줄 인수와 함께 이 기술을 사용하는 것은 매우 혼란스럽습니다. 나는 아무것도 모른다.

정확히 무엇이 당신을 혼란스럽게 하는지 자세히 설명해주세요. 나에게 결과는 예상했던 것과 거의 같습니다. 파일 객체가 읽기 전용으로 열린 경우(예: "<" 리디렉션) F_GETFL은 O_RDONLY를 제공합니다. 다른 유형의 리디렉션에도 마찬가지입니다.

리디렉션이 없으면 하위 명령은 상위 명령과 동일한 표준 설명자를 얻습니다. 사용자 터미널인 일반적인 상호 작용 상황에서는 모든 설명자를 읽고 쓸 수 있습니다. 읽기 전용, 쓰기 전용 등으로 만들기로 결정하는 것은 curses터미널 입력을 위해 0으로 분할하는 것보다 대화형 터미널 활동(예: 사용된 전체 화면 활동)에 동일한 설명자를 사용하는 것이 더 편리하기 때문에 쓸모가 없습니다. 터미널 출력 등을 위한 터미널 입력의 경우. 그러나 이는 사용자가 지정한 리디렉션으로 확장되지 않습니다. 그게 당신이 묻는 것인가요?

리디렉션을 사용할 때 &2,&1과 2,1의 차이점은 무엇입니까?

2>1및 와 같은 형식을 의미하는 경우 2>&1주로 다릅니다. 2>1파일에 쓰려면 2를 리디렉션하세요 1. 2>&12를 설명자 1의 복사본으로 리디렉션합니다(C 수준에서는 dup2(1,2)). 숫자 n과 m의 경우 동일하며 액세스 패턴에 제한을 추가하지 않습니다 n<&m.n>&m

관련 정보