Maison >Opération et maintenance >exploitation et maintenance Linux >Quelles sont les différences entre open et fopen sous Linux ?
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.
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
有缓冲。前者与read
, write
等配合使用, 后者与fread
,fwrite
等配合使用。
使用fopen
函数,由于在用户态下就有了缓冲,因此进行文件读写操作的时候就减少了用户态和内核态的切换(切换到内核态调用还是需要调用系统调用API:read
,write
);
而使用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="http://www.php.cn/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🎜🎜fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind
, etc. 🎜ouvrir, fermer, lire, écrire, getc, getchar, putc, putchar
, etc. 🎜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!