Quelles sont les différences entre open et fopen sous Linux ?

青灯夜游
Libérer: 2022-04-29 19:00:28
original
5072 Les gens l'ont consulté

Différences : 1. open est une fonction d'appel système UNIX, tandis que fopen est une fonction de bibliothèque en langage C dans la norme ANSIC ; 2. open n'est pas aussi portable que fopen 3. fopen ne peut utiliser que des fichiers normaux ordinaires, tandis qu'open peut ; exploiter des fichiers ordinaires, des fichiers, des sockets réseau, etc. 4. Open n'a pas de mise en mémoire tampon, tandis que fopen a une mise en mémoire tampon.

Quelles sont les différences entre open et fopen sous Linux ?

L'environnement d'exploitation de ce tutoriel : système linux5.9.8, ordinateur Dell G3.

Système Linux : La différence entre open et fopen

1. Source

Du point de vue de la source, les deux peuvent être bien distingués, ce qui est aussi la différence la plus évidente entre les deux :

open est une fonction d'appel système UNIX (y compris LINUX, etc.), qui renvoie le descripteur de fichier (f'd), qui est l'index du fichier dans la table des descripteurs de fichier 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> est une fonction de bibliothèque en langage C dans la norme ANSIC, qui doit appeler différentes API du noyau dans différents systèmes. Ce qui est renvoyé est un pointeur vers la structure du fichier. <p><a href="//m.sbmmt.com/course/list/33.html" target="_blank"></a>2. Portabilité </p>🎜🎜 Cela peut être déduit des sources ci-dessus. `fopen` est une fonction standard C, elle a donc une bonne portabilité ; tandis que `open` est un appel système UNIX et a une portabilité limitée. Pour des fonctions similaires sous Windows, utilisez la fonction API `CreateFile`. 🎜🎜🎜3. Champ d'application🎜🎜🎜<code>open renvoie le descripteur de fichier, et le descripteur de fichier est un concept important sous le système UNIX. Tous les appareils sous UNIX fonctionnent sous forme de fichiers. Tels que les prises réseau, les périphériques matériels, etc. Bien sûr, y compris l'exploitation de fichiers réguliers (Regular File). 🎜🎜fopen est utilisé pour manipuler des fichiers réguliers ordinaires (Regular File). 🎜🎜🎜4. Niveau IO du fichier🎜🎜🎜Du point de vue du fichier IO, la première est une fonction IO de bas niveau et la seconde est une fonction IO de haut niveau. La distinction simple entre bas niveau et haut niveau est la suivante : qui est le plus proche du noyau du système. Les E/S de fichier de bas niveau s'exécutent en mode noyau et les E/S de fichier de haut niveau s'exécutent en mode utilisateur. 🎜🎜🎜5. Buffering🎜🎜
  • 🎜Système de fichiers bufferisé
    Les caractéristiques du système de fichiers buffering sont : l'ouverture d'un "buffer" dans le mémoire, utilisée pour chaque fichier du programme ; lors de l'exécution d'une opération de lecture de fichier, les données sont d'abord lues à partir du fichier disque dans le « tampon » de la mémoire, puis les données requises sont lues à partir du « tampon » de la mémoire après leur enregistrement. complet. Lors de l'exécution d'une opération d'écriture de fichier, les données sont d'abord écrites dans la mémoire « tampon », puis le fichier est écrit une fois que la mémoire « tampon » est pleine. On peut voir que la taille du « tampon » de la mémoire affecte le nombre réel d'opérations de mémoire externe. Plus le « tampon » de mémoire est grand, moins il y a d'opérations de mémoire externe et la vitesse d'exécution est plus rapide et plus efficace. . D'une manière générale, la taille du fichier "buffer" dépend de la machine. fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind, etc. 🎜
  • 🎜Système de fichiers sans tampon
    Le système de fichiers avec tampon gère les fichiers à l'aide de pointeurs de structure de fichiers et accède aux fichiers via des pointeurs de fichiers. Il peut lire et écrire des caractères, des chaînes et formater des données. et peut également lire et écrire des données binaires. Le système de fichiers sans tampon repose sur le système d'exploitation. La lecture et l'écriture de fichiers via les fonctions du système d'exploitation sont des entrées et des sorties au niveau du système. Il n'a pas de pointeur de structure de fichier et ne peut lire et écrire que des fichiers binaires. est très efficace et rapide. La norme ANSI ne couvre plus les systèmes de fichiers sans tampon, il est donc recommandé de ne pas la choisir. ouvrir, fermer, lire, écrire, getc, getchar, putc, putchar, etc. 🎜
🎜Pour résumer en une phrase, open n'a pas de mise en mémoire tampon, et fopen a une mise en mémoire tampon. Le premier est utilisé conjointement avec read, write, etc., et le second est utilisé conjointement avec fread, fwrite, etc. 🎜🎜En utilisant la fonction <code>fopen, puisqu'il y a un tampon en mode utilisateur, cela réduit la commutation entre le mode utilisateur et le mode noyau lors des opérations de lecture et d'écriture de fichiers (il faut quand même l'appeler lors du passage en mode noyau) Appel système API : read, write); 🎜🎜Lorsque vous utilisez la fonction open, vous devez exécuter le noyau. mode à chaque fois lors de la lecture et de l'écriture de fichiers. et du changement de mode utilisateur ; 🎜🎜 montre que si les fichiers sont accédés de manière séquentielle, les fonctions de la série fopen sont plus rapides que d'appeler directement les fonctions de open. série ; si les fichiers sont accédés de manière aléatoire, l'inverse est vrai . 🎜🎜Recommandations associées : "🎜Tutoriel vidéo Linux🎜"🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!