>  기사  >  운영 및 유지보수  >  Linux에서 open과 fopen의 차이점은 무엇입니까?

Linux에서 open과 fopen의 차이점은 무엇입니까?

青灯夜游
青灯夜游원래의
2022-04-29 18:57:045219검색

차이점: 1. open은 UNIX 시스템 호출 함수인 반면 fopen은 ANSIC 표준의 C 언어 라이브러리 함수입니다. 2. open은 fopen만큼 이식성이 없습니다. 3. fopen은 일반 일반 파일만 작동할 수 있지만 open은 가능합니다. 일반 파일을 작동합니다. 파일, 네트워크 소켓 등 4. Open에는 버퍼링이 없지만 fopen에는 버퍼링이 있습니다.

Linux에서 open과 fopen의 차이점은 무엇입니까?

이 튜토리얼의 운영 환경: linux5.9.8 시스템, Dell G3 컴퓨터.

Linux 시스템: open과 fopen의 차이점

1. 소스

소스의 관점에서 보면 이 둘은 잘 구별될 수 있으며, 이는 둘 사이의 가장 분명한 차이점이기도 합니다.

open은 파일 설명자 테이블에 있는 파일의 인덱스인 파일 설명자(f'd)를 반환하는 UNIX 시스템 호출 함수(LINUX 등 포함)입니다. >fopen code>은 ANSIC 표준의 C 언어 라이브러리 함수로, 서로 다른 시스템에서 서로 다른 커널 API를 호출해야 합니다. 반환되는 것은 파일 구조에 대한 포인터입니다. open是UNIX系统调用函数(包括LINUX等),返回的是文件描述符(f'd),它是文件在文件描述符表里的索引;

fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核api。返回的是一个指向文件结构的指针。 

2、移植性

这一点从上面的来源就可以推断出来,`fopen`是C标准函数,因此拥有良好的移植性;而`open`是UNIX系统调用,移植性有限。如windows下相似的功能使用API函数`CreateFile`。

3、适用范围

open返回文件描述符,而文件描述符是UNIX系统下的一个重要概念,UNIX下的一切设备都是以文件的形式操作。如网络套接字、硬件设备等。当然包括操作普通正规文件(Regular File)。

fopen是用来操纵普通正规文件(Regular File)的。

4、文件IO层次

如果从文件IO的角度来看,前者属于低级IO函数,后者属于高级IO函数。低级和高级的简单区分标准是:谁离系统内核更近。低级文件IO运行在内核态,高级文件IO运行在用户态。

5、缓冲

  • 缓冲文件系统 
    缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用;当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”,装满后再从内存“缓冲区”依此读出需要的数据。执行写文件的操作时,先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写入文件。由此可以看出,内存“缓冲区”的大小,影响着实际操作外存的次数,内存“缓冲区”越大,则操作外存的次数就少,执行速度就快、效率高。一般来说,文件“缓冲区”的大小随机器 而定。fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等。

  • 非缓冲文件系统 
    缓冲文件系统是借助文件结构体指针来对文件进行管理,通过文件指针来对文件进行访问,既可以读写字符、字符串、格式化数据,也可以读写二进制数据。非缓冲文件系统依赖于操作系统,通过操作系统的功能对文件进行读写,是系统级的输入输出,它不设文件结构体指针,只能读写二进制文件,但效率高、速度快,由于ANSI标准不再包括非缓冲文件系统,因此建议大家最好不要选择它。open, close, read, write, getc, getchar, putc, putchar等。

一句话总结一下,就是open无缓冲,fopen有缓冲。前者与readwrite等配合使用, 后者与fread,fwrite等配合使用。

使用fopen函数,由于在用户态下就有了缓冲,因此进行文件读写操作的时候就减少了用户态和内核态的切换(切换到内核态调用还是需要调用系统调用API:readwrite);

而使用open函数,在文件读写时则每次都需要进行内核态和用户态的切换;

表现为,如果顺序访问文件,fopen系列的函数要比直接调用open

2. 이식성

이는 위 소스에서 추론할 수 있습니다. `fopen`은 C 표준 함수이므로 이식성이 좋지만 `open`은 UNIX 시스템 호출이므로 이식성이 제한됩니다. Windows에서 유사한 기능을 수행하려면 API 함수 'CreateFile'을 사용하세요. 🎜🎜🎜3. 적용 범위🎜🎜🎜open은 파일 디스크립터를 반환하는데, 파일 디스크립터는 UNIX 시스템에서 중요한 개념입니다. 네트워크 소켓, 하드웨어 장치 등 물론, 일반 파일(Regular File)의 운용도 포함됩니다. 🎜🎜fopen은 일반 일반 파일(Regular File)을 조작하는 데 사용됩니다. 🎜🎜🎜4. 파일 IO 레벨🎜🎜🎜파일 IO 관점에서 전자는 하위 레벨 IO 기능이고 후자는 상위 레벨 IO 기능입니다. 낮은 수준과 높은 수준의 간단한 구분은 누가 시스템 커널에 더 가까운가입니다. 낮은 수준의 파일 IO는 커널 모드에서 실행되고 높은 수준의 파일 IO는 사용자 모드에서 실행됩니다. 🎜🎜🎜5. 버퍼링🎜🎜
  • 🎜버퍼링 파일 시스템
    버퍼링 파일 시스템의 특징은 다음과 같습니다. 메모리, 프로그램의 모든 파일에 사용됩니다. 파일 읽기 작업을 수행할 때 데이터는 먼저 디스크 파일에서 메모리 "버퍼"로 읽혀지고, 가득 찬 후에는 메모리 "버퍼"에서 필요한 데이터가 읽혀집니다. "따라서. 파일 쓰기 작업을 수행할 때 데이터는 먼저 메모리 "버퍼"에 쓰여지고, 메모리 "버퍼"가 가득 찬 후에 파일이 쓰여집니다. 이를 통해 메모리 "버퍼"의 크기가 실제 외부 메모리 작업 횟수에 영향을 미친다는 것을 알 수 있습니다. 메모리 "버퍼"가 클수록 외부 메모리 작업 횟수는 줄어들고 실행 속도는 더 빠르고 효율적입니다. . 일반적으로 파일 "버퍼"의 크기는 시스템에 따라 다릅니다. fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind 등 🎜
  • 🎜버퍼되지 않은 파일 시스템
    버퍼된 파일 시스템은 파일 구조 포인터를 사용하여 파일을 관리하고 파일 포인터를 통해 파일에 액세스할 수 있으며 문자, 문자열, 형식 데이터를 읽고 쓸 수 있습니다. 바이너리 데이터를 읽고 씁니다. 버퍼링되지 않은 파일 시스템은 운영 체제에 의존하며 운영 체제의 기능을 통해 파일을 읽고 쓰는 것은 시스템 수준의 입출력이며 파일 구조 포인터가 없으며 바이너리 파일만 읽고 쓸 수 있습니다. ANSI 표준은 더 이상 버퍼링되지 않은 파일 시스템에 적용되지 않으므로 선택하지 않는 것이 좋습니다. 열기, 닫기, 읽기, 쓰기, getc, getchar, putc, putchar 등 🎜
🎜한 문장으로 요약하자면 open에는 버퍼링이 없고, fopen에는 버퍼링이 있습니다. 전자는 read, write 등과 결합하여 사용되고, 후자는 fread, fwrite 등 🎜🎜<code>fopen 함수를 사용하면 사용자 모드에 버퍼가 있기 때문에 파일 읽기 및 쓰기 작업을 수행할 때 사용자 모드와 커널 모드 사이의 전환이 줄어듭니다(여전히 호출해야 함) 커널 모드로 전환 시) 시스템 호출 API: read, write) 🎜🎜open 함수 사용 시 커널 수행이 필요합니다. 파일을 읽고 쓸 때마다 모드를 사용하고 사용자 모드를 전환합니다. 🎜🎜성능은 파일을 순차적으로 액세스하는 경우 fopen 시리즈의 기능이 직접 호출하는 것보다 빠릅니다. >open 시리즈; 파일이 무작위로 액세스되면 그 반대가 됩니다. 🎜🎜관련 추천: "🎜Linux 비디오 튜토리얼🎜"🎜

위 내용은 Linux에서 open과 fopen의 차이점은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.