차이점: 1. open은 UNIX 시스템 호출 함수인 반면 fopen은 ANSIC 표준의 C 언어 라이브러리 함수입니다. 2. open은 fopen만큼 이식성이 없습니다. 3. fopen은 일반 일반 파일만 작동할 수 있지만 open은 가능합니다. 일반 파일을 작동합니다. 파일, 네트워크 소켓 등 4. 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
有缓冲。前者与read
, write
等配合使用, 后者与fread
,fwrite
等配合使用。
使用fopen
函数,由于在用户态下就有了缓冲,因此进行文件读写操作的时候就减少了用户态和内核态的切换(切换到内核态调用还是需要调用系统调用API:read
,write
);
而使用open
函数,在文件读写时则每次都需要进行内核态和用户态的切换;
表现为,如果顺序访问文件,fopen
系列的函数要比直接调用open
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
등 🎜열기, 닫기, 읽기, 쓰기, getc, getchar, putc, putchar
등 🎜open
에는 버퍼링이 없고, fopen
에는 버퍼링이 있습니다. 전자는 read
, write
등과 결합하여 사용되고, 후자는 fread
, fwrite 등 🎜🎜<code>fopen
함수를 사용하면 사용자 모드에 버퍼가 있기 때문에 파일 읽기 및 쓰기 작업을 수행할 때 사용자 모드와 커널 모드 사이의 전환이 줄어듭니다(여전히 호출해야 함) 커널 모드로 전환 시) 시스템 호출 API: read
, write
) 🎜🎜open
함수 사용 시 커널 수행이 필요합니다. 파일을 읽고 쓸 때마다 모드를 사용하고 사용자 모드를 전환합니다. 🎜🎜성능은 파일을 순차적으로 액세스하는 경우 fopen
시리즈의 기능이 직접 호출하는 것보다 빠릅니다. >open 시리즈; 파일이 무작위로 액세스되면 그 반대가 됩니다. 🎜🎜관련 추천: "🎜Linux 비디오 튜토리얼🎜"🎜위 내용은 Linux에서 open과 fopen의 차이점은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!