불필요한 파일 설명자를 닫습니다.

불필요한 파일 설명자를 닫습니다.

파이프가 어떻게 작동하는지 이해하고 싶습니다. 이 코드 조각은 웹사이트에서 가져온 것입니다.

따라서 프로그램에 대한 나의 이해는 다음과 같습니다.

pipe(fd)그렇게 하면 (지금까지 fd[0]=3, & 만 열려 있었다고 가정). 이제 부모를 포크하고 자식이 생성되지 않으면 오류와 함께 종료됩니다.fd[0]=4012

하지만 하위 프로세스가 성공적으로 생성되면 파일 설명자가 하위 프로세스에 복사됩니다. 하위 프로세스 fd[0]=3에도 마찬가지라는 뜻입니까? fd[1]=4파일 핸들 은 어떤 파일에 적용 fd[0]됩니까 fd[1](지정하지 않음)?

자식이 부모로부터 읽기를 원한다고 가정해 보겠습니다. 그러면 부모는 꺼져 있어야 fd[0]하고 자식은 꺼져야 합니다 fd[1]. 그런데 왜 그럴까요? 닫지 않으면 어떻게 되나요? 난 이해가 안 돼요 On a technical note, the EOF will never be returned if the unnecessary ends of the pipe are not explicitly closed..

부모가 자식으로부터 데이터를 받으려면 fd1을 닫고 자식은 fd0을 닫아야 합니다. 부모가 자식에게 데이터를 보내려면 fd0을 닫고 자식은 fd1을 닫아야 합니다. 설명자는 부모와 자식 간에 공유되므로 신경 쓰지 않는 파이프의 끝을 항상 닫아야 합니다. 기술적으로 파이프의 불필요한 끝이 명시적으로 닫히지 않으면 EOF가 반환되지 않습니다.

    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>

    main()
    {
            int     fd[2];
            pid_t   childpid;

            pipe(fd);

            if((childpid = fork()) == -1)
            {
                    perror("fork");
                    exit(1);
            }

            if(childpid == 0)
            {
                    /* Child process closes up input side of pipe */
                    close(fd[0]);
            }
            else
            {
                    /* Parent process closes up output side of pipe */
                    close(fd[1]);
            }
            .
            .
    }

답변1

A는 fork실제로 포크입니다. 거의 동일한 두 개의 프로세스를 얻게 됩니다. 주요 차이점은 fork()시스템 호출의 반환 값이며, 이는 다음으로 식별되는 하위 프로세스의 pid입니다.부모하위 프로세스에서 0(소프트웨어가 어떤 프로세스를 고려하는지 결정하는 방법입니다.부모(부모는 자녀를 돌볼 책임이 있습니다.) 어느 것이어린이).

특히, 메모리가 중복되므로 fd배열에는 동일한 내용이 포함되며( fd[0]한 프로세스에서 3이면 다른 프로세스에서는 3이 됨) 파일 설명자도 중복됩니다. 아이의 fd 3은 같은 것을 가리킬 것입니다파일 설명 열기부모의 fd 3으로.

따라서 부모와 자식 모두의 fd 3은 파이프의 한쪽 끝을 가리키고 fd[1]부모와 자식 모두의 fd 4( )는 파이프의 다른 쪽 끝을 가리킵니다.

한 프로세스가 이 파이프를 사용하여 다른 프로세스로 데이터를 보내길 원합니다. 일반적으로 프로세스 중 하나는 fd 4에 쓰고 다른 프로세스는 확인할 때까지 fd 3에서 읽습니다.파일 끝.

파일 끝파이프 반대편에 열려 있는 모든 fd가 닫히면 도달합니다. 따라서 독자가 다른 쪽 끝으로 fd를 닫지 않으면 결코 볼 수 없습니다.파일 끝.

마찬가지로, 독자가 죽으면 작성자가 파이프의 다른 쪽 끝에서 자신의 fd를 닫지 않으면 쓰기를 중단해야 한다는 사실을 결코 알 수 없습니다.

관련 정보