AKTUALNOŚCI

nowości, informacje, szkolenia

dup2 예제

2/08/2019

aidanrh7, 당신은 좋은 질문을 제기 : 선제적으로 파이프를 닫지 않습니다 (즉, 자식 과정에서) 의사 소통에서 자식 프로세스를 방지? 요컨대, 대답은 `아니오`입니다. dup2의 내부 메커니즘에 익숙하지 않습니다. 그러나 이 프로그램과 관련하여 자식 프로세스의 파이프 액세스 포인트가 불필요하게 됩니다. 파이프가 커널의 주소 공간에 있기 때문입니다. 예를 들어, dup2를 사용하여 자식 프로세스 1에서 ps의 표준 출력을 리디렉션하면 자식 주소 공간의 파이프 액세스 포인트가 더 이상 필요하지 않습니다. execlp에 의해 실행되는 바이너리는 파이프의 쓰기 끝에 표준 출력을 지시합니다. 다음 예제에서는 현재 프로세스에 대한 표준 출력을 닫고 표준 출력을 다시 할당하여 pfd에서 참조하는 파일로 이동하고 원래 파일 설명기를 닫아 정리합니다. 리눅스에서 파이프에 대 한 자세한: https://unix.stackexchange.com/questions/148401/how-pipes-work-in-linux 리디렉션의 더 많은 예: http://www.cs.loyola.edu/~jglenn/702/S2005/Examples/dup2.html dup2에 대 한 자세한: http://codewiki.wikidot.com/c:system-calls:dup2 파이프를 닫아야 하는 이유: https://stackoverflow.com/questions/19265191/why-should-you-close-a-pipe-in-linux. 다음 예제는 stderr에서 stdout으로 메시지를 리디렉션합니다. 표시된 간략한 코드 세그먼트는 dup2(동작에서 매우 유사하지만 IEEE Std 1003.1-2001 의 이 볼륨에 정의된 다른 함수를 기반으로 하는 준수 구현은 훨씬 더 복잡합니다. 단계 간에 호출되고 파일 설명자 할당 또는 할당 해제할 수 있는 신호 catch 함수의 가능한 효과는 분명하지 않습니다. 이는 신호를 차단하여 피할 수 있습니다. .

이 주제에 대한 나의 이해는 제한적이라는 점은 주목할 가치가 있습니다. 이것은 단순히 나에게 의미가있는 방법입니다. 바라건대, 더 많은 지식이 있는 사람이 함께 와서 적절한 설명을 할 수 있기를 바랍니다. 나는 당신과 같은 것을 궁금해 함께 오는 다른 사람에게 도움이 될 수있는 간단한 설명을 제공 할 것이라고 생각했다. @aidanrh7 질문에 대한 대답은 각 프로세스 내에서 한 파이프의 한쪽 끝만 쓰거나 읽는 다는 것입니다. / 에서 읽을 것입니다 쪽은 속임수, 다른 모든 폐쇄. 닫기는 단순히 지정된 개체와 연결되었던 fd(이 경우 파이프의 읽기 또는 쓰기 끝)가 더 이상 해당 객체를 가리키지 않도록 해제된다는 의미입니다. 속은 끝은 이미 0(stdin) 또는 1(stdout의 경우)으로 할당되어 0 또는 1이 해당 끝을 가리키도록 합니다. 따라서, 문제의 끝을 가리키는 원래 의 FD를 해제 할 필요가. dup2()를 사용하는 대신 close() 및 dup()를 사용할 수도 있고 대체 So dup2(pipe2[0], 0)를 사용할 수도 있습니다. 또한 close (0)에 의해 달성 될 수있다; dup(파이프2[0]); int dup(int fildes); int dup2(int fildes, int fildes2); dup2() 함수는 fileds가 지정한 파일 설명자가 복제됩니다. 새 파일 설명자의 수가 제출됩니다2.

이 설명자로 파일이 이미 열려 있으면 중복을 시도하기 전에 파일이 닫힙됩니다. 70, 84 및 87 줄을 의미하는 exec 호출 내에서 stdin 및 stdout 파일을 닫아야하는 이유를 설명 해 주시겠습니까? 이것들을 읽고 쓰기 위해 열려있어야하는 것처럼 보이지만, 나는 뭔가를 오해해야합니다. 감사! 코드는 매우 유용합니다. 도움을 주셔서 감사합니다,하지만 당신은 컴파일되지 않는 뭔가를 게시 할 이유를 확실하지 않다. dup() 시스템 호출은 파일 설명자의 복사본을 만듭니다. 이 프로그램은 파일을 열고 작성을 포함하기 때문에 온라인 컴파일러에서 실행되지 않습니다. [EBADF]에 대한 설명에서 범위를 벗어난 필드의 경우 유효하지 않은 fildes의 지정된 케이스에 의해 적용됩니다. fildes 및 fildes2에 대한 설명은 fildes2와 관련된 유일한 종류의 무효가 범위를 벗어났는지 여부이기 때문에 다릅니다. 즉, fildes2가 dup2() 호출이 수행될 때 열린 파일을 참조하는지 여부는 중요하지 않습니다. dup2() 함수는 fcntl()에 의해 형식 안전하지 않은 버전에서 제공되는 형식 안전 버전의 기능을 제공하므로 사용되지 않는 것으로 표시되지 않습니다.