Heim  >  Artikel  >  Betrieb und Instandhaltung  >  Was sind die Unterschiede zwischen open und fopen unter Linux?

Was sind die Unterschiede zwischen open und fopen unter Linux?

青灯夜游
青灯夜游Original
2022-04-29 18:57:045247Durchsuche

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.

Was sind die Unterschiede zwischen open und fopen unter Linux?

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有缓冲。前者与readwrite等配合使用, 后者与fread,fwrite等配合使用。

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

而使用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="http://www.php.cn/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🎜🎜
  • 🎜Pufferdateisystem
    Die Eigenschaften des Pufferdateisystems sind: Öffnen eines „Puffers“ im Speicher: Wird für jede Datei im Programm verwendet. Beim Durchführen eines Dateilesevorgangs werden die Daten zuerst aus der Festplattendatei in den Speicher-„Puffer“ gelesen und anschließend werden die erforderlichen Daten aus dem Speicher-„Puffer“ ausgelesen voll. Beim Durchführen eines Dateischreibvorgangs werden die Daten zunächst in den Speicher-„Puffer“ geschrieben und die Datei erst dann geschrieben, wenn der Speicher-„Puffer“ voll ist. Daraus ist ersichtlich, dass die Größe des Speicherpuffers die tatsächliche Anzahl externer Speicheroperationen beeinflusst. Je größer der Speicherpuffer ist, desto geringer ist die Anzahl externer Speicheroperationen und die Ausführungsgeschwindigkeit ist schneller und effizienter . Im Allgemeinen hängt die Größe des Dateipuffers von der Maschine ab. fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind usw. 🎜
  • 🎜Nicht gepuffertes Dateisystem
    Das gepufferte Dateisystem verwaltet Dateien mithilfe von Dateistrukturzeigern und greift über Dateizeiger auf Dateien zu. Es kann Zeichen, Zeichenfolgen und Formatdaten lesen und schreiben und kann auch Binärdaten lesen und schreiben. Das nicht gepufferte Dateisystem ist auf die Funktionen des Betriebssystems angewiesen. Es verfügt über keinen Dateistrukturzeiger und kann nur Binärdateien lesen und schreiben ist hocheffizient und schnell. Der ANSI-Standard deckt keine ungepufferten Dateisysteme mehr ab, daher wird empfohlen, ihn nicht zu wählen. öffnen, schließen, lesen, schreiben, getc, getchar, putc, putchar usw. 🎜
🎜Um es in einem Satz zusammenzufassen: 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn