programing

HANDLES에 fdopen과 동등한 윈도우가 있습니까?

subpage 2023. 10. 1. 19:27
반응형

HANDLES에 fdopen과 동등한 윈도우가 있습니까?

유닉스에서는 소켓, 파이프 또는 상위 프로세스에서 상속된 파일 설명자가 있는 경우 버퍼 I/O를 열 수 있습니다.FILE*그것을 타고 흐르다

Windows에 다음과 같은 기능이 있습니까?HANDLEs? 만약 당신이.HANDLE부모 프로세스(stdin, stdout 또는 stderr와 다름) 또는 파이프에서 상속되었습니다.CreatePipe, 버퍼링이 가능한가요?FILE*거기서 스트림?MSDN은 문서화를 하지만 그것은 반환되는 정수 파일 기술자와 함께 작동합니다._open, 일반적이지 않은HANDLEs.

불행하게도,HANDLEs는 완전히 다른 짐승입니다.FILE*s 및 파일 설명자.CRT는 궁극적으로 다음과 같은 측면에서 파일을 처리합니다.HANDLE그것들을 연관짓습니다.HANDLE파일 설명자에 s를 저장합니다.파일 설명자는 다음과 같이 구조 포인터를 백업합니다.FILE*.

다행히 이 MSDN 페이지에는 "파일 구조, 파일 설명자 및 Win32 파일 핸들 사이에서 파일의 표현을 변경할 수 있는 방법"을 설명하는 섹션이 있습니다.

  • _fdopen,_wfdopen: 스트림을 이전에 로우 레벨 I/O용으로 열린 파일과 연결하고 포인터를 열린 스트림으로 반환합니다.
  • _fileno: 스트림과 연결된 파일 설명자를 가져옵니다.
  • _get_osfhandle: 기존 C 런타임 파일 설명자와 연결된 운영 체제 파일 핸들 반환
  • _open_osfhandle: C 런타임 파일 설명자를 기존 운영 체제 파일 핸들과 연결합니다.

당신이 필요로 하는 것은 그 다음에 필요한 것으로 보입니다.FILE*로부터HANDLE.

여기에 관련된 예가 있습니다.HANDLE에서 얻은 sCreateFile(). 테스트를 해보니 "test.txt" 파일의 처음 255자가 표시되고 파일 끝에 " --- Hello World! ---"가 추가됩니다.

#include <windows.h>
#include <io.h>
#include <fcntl.h>
#include <cstdio>

int main()
{
    HANDLE h = CreateFile("test.txt", GENERIC_READ | GENERIC_WRITE, 0, 0,
        OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    if(h != INVALID_HANDLE_VALUE)
    {
        int fd = _open_osfhandle((intptr_t)h, _O_APPEND | _O_RDONLY);
        if(fd != -1)
        {
            FILE* f = _fdopen(fd, "a+");
            if(f != 0)
            {
                char rbuffer[256];
                memset(rbuffer, 0, 256);
                fread(rbuffer, 1, 255, f);
                printf("read: %s\n", rbuffer);
                fseek(f, 0, SEEK_CUR); // Switch from read to write
                const char* wbuffer = " --- Hello World! --- \n";
                fwrite(wbuffer, 1, strlen(wbuffer), f);
                fclose(f); // Also calls _close()
            }
            else
            {
                _close(fd); // Also calls CloseHandle()
            }
        }
        else
        {
            CloseHandle(h);
        }
    }
}

이것은 파이프에도 효과가 있을 것입니다.

다음은 CreateFile 대신 보다 우아한 방법입니다. fopen()에 "N"을 지정합니다.오픈하기 위한 마이크로소프트 고유의 확장이지만, 어쨌든 이 코드는 플랫폼 고유의 것이기 때문에 괜찮습니다."N"과 함께 호출하면 fopen은 내부적으로 _open을 호출할 때 _O_NOINHERIT 플래그를 추가합니다.

이를 바탕으로:Windows C Run-Time _close(fd) 파일을 닫지 않음

언급URL : https://stackoverflow.com/questions/7369445/is-there-a-windows-equivalent-to-fdopen-for-handles

반응형