Unterschiede: 1. open ist eine UNIX-Systemaufruffunktion, während fopen eine C-Sprachbibliotheksfunktion im ANSIC-Standard ist; 2. open ist nicht so portierbar wie fopen; 3. fopen kann nur normale reguläre Dateien bedienen Betreiben Sie normale Dateien, Netzwerk-Sockets usw.; 4. Open hat keine Pufferung, während fopen eine Pufferung hat.
Die Betriebsumgebung dieses Tutorials: Linux5.9.8-System, Dell G3-Computer.
Linux-System: Der Unterschied zwischen Open und Fopen
1. Quelle
Aus der Perspektive der Quelle können die beiden gut unterschieden werden, was auch der offensichtlichste Unterschied zwischen den beiden ist:
open
ist eine UNIX-Systemaufruffunktion (einschließlich LINUX usw.), die den Dateideskriptor (f'd) zurückgibt, der der Index der Datei in der Dateideskriptortabelle ist 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
fopen code> ist eine C-Sprachbibliotheksfunktion im ANSIC-Standard, die verschiedene Kernel-APIs in verschiedenen Systemen aufrufen soll. Zurückgegeben wird ein Zeiger auf die Dateistruktur. <p><a href="//m.sbmmt.com/course/list/33.html" target="_blank"></a>2. Portabilität </p>🎜🎜 Dies lässt sich aus den oben genannten Quellen ableiten. „fopen“ ist daher eine gute Portabilität, während „open“ ein UNIX-Systemaufruf ist. Für ähnliche Funktionen unter Windows verwenden Sie die API-Funktion „CreateFile“. 🎜🎜🎜3. Anwendungsbereich🎜🎜🎜<code>open
gibt den Dateideskriptor zurück, und der Dateideskriptor ist ein wichtiges Konzept unter dem UNIX-System. Alle Geräte unter UNIX arbeiten in Form von Dateien. Wie Netzwerksteckdosen, Hardwaregeräte usw. Natürlich inklusive Betrieb regulärer Dateien (Regular File). 🎜🎜fopen wird zum Bearbeiten gewöhnlicher regulärer Dateien (Regular File) verwendet. 🎜🎜🎜4. Datei-E/A-Ebene🎜🎜🎜Aus Sicht der Datei-E/A ist Ersteres eine E/A-Funktion auf niedriger Ebene und Letzteres eine E/A-Funktion auf hoher Ebene. Der einfache Unterschied zwischen Low-Level und High-Level besteht darin, wer näher am Systemkernel ist. Datei-E/A auf niedriger Ebene wird im Kernelmodus ausgeführt, Datei-E/A auf hoher Ebene wird im Benutzermodus ausgeführt. 🎜🎜🎜5. Pufferung🎜🎜fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind
usw. 🎜öffnen, schließen, lesen, schreiben, getc, getchar, putc, putchar
usw. 🎜open
hat keine Pufferung und fopen
hat eine Pufferung. Ersteres wird in Verbindung mit read
, write
usw. verwendet, und letzteres wird in Verbindung mit fread
, fwrite usw. 🎜🎜Mit der Funktion <code>fopen
wird der Wechsel zwischen dem Benutzermodus und dem Kernelmodus beim Lesen und Schreiben von Dateien reduziert, da im Benutzermodus ein Puffer vorhanden ist (sie muss trotzdem aufgerufen werden). beim Umschalten in den Kernel-Modus) Systemaufruf-API: lesen
, schreiben
); 🎜🎜Bei Verwendung der Funktion öffnen
müssen Sie den Kernel ausführen Modus jedes Mal beim Lesen und Schreiben von Dateien. 🎜🎜 zeigt, dass die Funktionen der fopen
-Reihe schneller sind als der direkte Aufruf der Funktionen von open
-Serie; wenn auf die Dateien zufällig zugegriffen wird, ist das Gegenteil der Fall. 🎜🎜Verwandte Empfehlungen: „🎜Linux-Video-Tutorial🎜“🎜Das obige ist der detaillierte Inhalt vonWas sind die Unterschiede zwischen open und fopen unter Linux?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!