Programing

파일 설명자와 파일 포인터의 차이점은 무엇입니까?

crosscheck 2020. 8. 13. 07:50
반응형

파일 설명자와 파일 포인터의 차이점은 무엇입니까?


파일 설명자와 파일 포인터의 차이점을 알고 싶습니다.

또한 어떤 시나리오에서 다른 것 대신 하나를 사용 하시겠습니까?


파일 설명자는 Linux 및 기타 Unix 계열 시스템에서 커널 수준에서 열린 파일 (또는 소켓 등)을 식별하는 데 사용되는 저수준 정수 "핸들"입니다.

당신은 같은 실제 유닉스 호출에 "알몸"파일 설명을 통과 read(), write()등등.

FILE포인터는 파일을 표현하는 데 사용되는 C 표준 라이브러리 수준의 구조입니다. FILE파일 기술자를 래핑, 그리고 I / O를 쉽게하기 위해 버퍼링 및 기타 기능을 추가합니다.

당신은 통과 FILE같은 표준 C 함수에 대한 포인터를 fread()하고 fwrite().


하나는 버퍼링되고 ( FILE *) 다른 하나는 버퍼링 되지 않습니다. 실제로, 당신은 FILE *당신이 무엇을하고 있는지 또는 당신의 파일이 실제로 소켓이 아닌 경우가 아니라면, 당신이 '실제'파일 (즉, 드라이브에서)에서 읽을 때 거의 항상 사용하기를 원합니다 .

FILE *사용 에서 파일 설명자를 가져올 수 있으며 다음을 사용하여 파일 설명자에서 fileno()버퍼링 된 FILE *파일을 열 수 있습니다.fdopen()


파일 디스크립터는 Posix의 open()호출 에서 얻은 정수입니다 . 표준 C fopen()사용하면 FILE구조체를 다시 얻을 수 있습니다. FILE구조체는 파일의 끝 등의 에러 표시, 스트림 위치와 같은 다른 것들 사이에이 파일 디스크립터를 포함

따라서를 사용 fopen()하면 open(). 일반적으로 fopen()더 이식성이 FILE높고 struct, ie fprintf()및 family 를 사용하는 다른 모든 표준 C 함수를 사용할 수 있기 때문에 사용해야합니다 .

또는 둘 중 하나를 사용하는 성능 문제가 없습니다.


파일 설명자 대 파일 포인터

파일 설명자 :

파일 설명자는 open()시스템 호출에서 반환되는 정수 값 입니다.

int fd = open (filePath, mode);

  1. 로우 / 커널 레벨 핸들러.
  2. UNIX 시스템 호출의 read () 및 write ()에 전달합니다.
  3. 버퍼링 및 이러한 기능은 포함되지 않습니다.
  4. 휴대 성이 떨어지고 효율성이 떨어집니다.

파일 포인터 :

파일 포인터는 파일 식별, 파일 설명자 래핑, 버퍼링 기능 및 I / O 작업에 필요한 기타 모든 기능에fopen() 사용 되는 라이브러리 함수에 의해 반환 된 C 구조에 대한 포인터입니다. 파일 포인터는 FILE 형식 이며 해당 정의는 "/usr/include/stdio.h" 에서 찾을 수 있습니다 . 이 정의는 컴파일러마다 다를 수 있습니다.

FILE *fp = fopen (filePath, mode);

// A FILE Structure returned by fopen 
    typedef struct 
    {
        unsigned char   *_ptr;
        int     _cnt;
        unsigned char   *_base;
        unsigned char   *_bufendp;
        short   _flag;
        short   _file;
        int     __stdioid;
        char    *__newbase;
#ifdef _THREAD_SAFE
        void *_lock;
#else
        long    _unused[1];
#endif
#ifdef __64BIT__
        long    _unused1[4];
#endif /* __64BIT__ */
    } FILE;
  1. 높은 수준의 인터페이스입니다.
  2. fread () 및 fwrite () 함수에 전달됩니다.
  3. 버퍼링, 오류 표시 및 EOF 감지 등이 포함됩니다.
  4. 더 높은 이동성과 효율성을 제공합니다.

유용 할 수있는 포인트를 추가하고 싶습니다.

FILE *

  1. 프로세스 간 통신 (IPC)에는 사용할 수 없습니다.
  2. 범용 버퍼링 된 I / O가 필요할 때 사용하십시오. (printf, frpintf, snprintf, scanf)
  3. 디버그 로그에 여러 번 사용합니다. 예,

                 FILE *fp;
                 fp = fopen("debug.txt","a");
                 fprintf(fp,"I have reached till this point");
                 fclose(fp);
    

FILE DESCRIPTOR

  1. It's generally used for IPC.

  2. Gives low-level control to files on *nix systems.(devices,files,sockets,etc), hence more powerfull than the FILE *.


FILE * is more useful when you work with text files and user input/output, because it allows you to use API functions like sprintf(), sscanf(), fgets(), feof() etc.

File descriptor API is low-level, so it allows to work with sockets, pipes, memory-mapped files (and regular files, of course).


Just a note to finish out the discussion (if interested)....

fopen can be insecure, and you should probably use fopen_s or open with exclusive bits set. C1X is offering x modes, so you can fopen with modes "rx", "wx", etc.

If you use open, you might consider open(..., O_EXCL | O_RDONLY,... ) or open(..., O_CREAT | O_EXCL | O_WRONLY,... ).

See, for example, Do not make assumptions about fopen() and file creation.


System calls are mostly using file descriptor, for example read and write. Library function will use the file pointers ( printf , scanf). But, library functions are using internally system calls only.

참고URL : https://stackoverflow.com/questions/2423628/whats-the-difference-between-a-file-descriptor-and-file-pointer

반응형