Maison  >  Article  >  Opération et maintenance  >  Que signifie Linux eof ?

Que signifie Linux eof ?

藏色散人
藏色散人original
2023-03-25 09:20:092535parcourir

linux eof fait généralement référence à la fin du fichier ; EOF est un terme informatique, l'abréviation de End Of File, dans le système d'exploitation, cela signifie que la source de données n'a plus de données à lire sous Linux, au début. d'une nouvelle ligne, appuyez sur Appuyez sur "Ctrl+D" pour représenter EOF.

Que signifie Linux eof ?

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

Que signifie Linux eof ?

EOF est un terme informatique, qui est l'abréviation de End Of File. Dans le système d'exploitation, il indique que la source de données n'a plus de données à lire. Sous Linux, il fait généralement référence à la fin du fichier.

Comment utiliser EOF pour déterminer si le programme a lu la fin du fichier ?

Une idée très importante dans le système Linux est la suivante : tout est un fichier. Qu'il s'agisse d'une entrée standard, de fichiers texte ordinaires dans le système de fichiers ou de flux réseau, ils peuvent être considérés comme des fichiers et peuvent être lus et écrits via la fonction de lecture/écriture. Par conséquent, différents types de fichiers ont différentes manières de déterminer si la fin du fichier a été lue. Ce qui suit est un

  • fichier texte ordinaire

  • fichier d'entrée standard (stdin)

  • fichier de flux socket

Ces trois types de fichiers présenteront des méthodes permettant de déterminer s'ils ont été lus jusqu'à la fin du fichier.

Fichiers texte ordinaires

Les fichiers ordinaires ici font référence aux fichiers texte que nous voyons habituellement via le gestionnaire de fichiers. Ils existent dans le système de fichiers sous Linux et la taille du fichier est fixe.

Pour ce type de fichier, la façon dont le système Linux détermine si un fichier texte ordinaire a été lu jusqu'à la fin du fichier est la suivante : la fonction de lecture maintient un pointeur de lecture pour le fichier ouvert, puis soustrait ce pointeur du pointeur valeur au début du fichier. Obtenez un décalage en octets par rapport au début du fichier, et enfin comparez les octets de décalage avec la taille du fichier lui-même si le décalage en octets par rapport au début du fichier est supérieur à la taille. du fichier lui-même, puis une constante EOF est renvoyée, indiquant que la fin du fichier a été lue.

Donc, selon l'écriture ci-dessus, si un fichier contient n caractères, alors l'opération interne de la boucle while s'exécutera n+1 fois. Par conséquent, la façon la plus sûre de l'écrire est la suivante :

int c = fgetc(fp);
while (c != EOF) {
    do something;
    c = fgetc(fp);
}
if (feof(fp)) {
    printf("\n End of file reached.");
} else {
    printf("\n Something went wrong.");
}

Fichier d'entrée standard

Fichier d'entrée standard (stdin) Il correspond à la saisie du clavier périphérique, et dans le système Linux, il est résumé dans un fichier, exactement Il est dit être un fichier de flux. La plus grande différence entre ce type de fichier et le fichier texte ordinaire ci-dessus est que sa taille n'est pas fixe. Il ressemble à l'extrémité d'entrée d'une conduite d'eau et peut recevoir des entrées à tout moment.

C'est précisément en raison des caractéristiques de streaming du fichier d'entrée standard qu'il est impossible de juger si la fin du fichier a été lue via la méthode de comparaison de taille de fichier mentionnée ci-dessus. Par conséquent, la façon dont le système Linux détermine si le fichier d'entrée standard a été lu jusqu'à la fin du fichier consiste à définir une marque d'entrée spéciale pour indiquer la fin du fichier. Dans le système Linux, cette marque est la combinaison de touches Ctrl+. D. Lorsque le système capture cette combinaison de touches Quand, laissez la fonction r read renvoyer une constante EOF pour informer le programme qu'il a lu jusqu'à la fin du fichier standard.

fichier de flux de socket

Le fichier de flux de socket est similaire au fichier d'entrée standard et il lit les données du réseau, donc les deux méthodes ci-dessus pour juger si le fichier est lu jusqu'à la fin ne sont pas applicables pour les fichiers de flux de socket.

Alors, comment le processus client détermine-t-il si le processus serveur a fini d'écrire toutes les données ?

Dans le fichier de flux de socket, lorsque le processus client lit les données envoyées par le processus du serveur distant via la fonction de lecture, il utilise le blocage des E/S pour lire. Tant que la connexion entre le client et le serveur n'est pas déconnectée, si le serveur n'écrit pas de données sur le socket, l'opération de lecture du client sera bloquée jusqu'à ce que de nouvelles données soient écrites sur le serveur.

Si le processus serveur ferme la connexion socket, le client recevra un paquet FIN du protocole TCP envoyé par le serveur, puis la fonction de lecture du processus client qui était initialement bloquée en attendant de recevoir des données du processus serveur sera réveillée up et renvoie une valeur de 0. C'est un peu différent de la situation où les deux types de fichiers que nous avons mentionnés précédemment renvoient EOF (la valeur est -1) après la lecture de la fin du fichier. Par conséquent, lors de la lecture depuis le socket dans le programme, l'indicateur permet de juger de la fin. du flux de données n'est pas -1 mais 0. .

Sous Linux, appuyer sur Ctrl-D au début d'une nouvelle ligne signifie EOF (si vous appuyez sur Ctrl-D au milieu d'une ligne, cela signifie afficher la zone tampon "d'entrée standard", vous devez donc appuyer deux fois à ce moment-là. temps. fois Ctrl-D); sous Windows, Ctrl-Z signifie EOF. (À propos, appuyer sur Ctrl-Z sous Linux signifie interrompre le processus et le suspendre en arrière-plan. Vous pouvez utiliser la commande fg pour revenir au premier plan ; appuyer sur Ctrl-C signifie mettre fin au processus.)

那么,如果真的想输入Ctrl-D怎么办?这时必须先按下Ctrl-V,然后就可以输入Ctrl-D,系统就不会认为这是EOF信号。Ctrl-V表示按”字面含义”解读下一个输入,要是想按”字面含义”输入Ctrl-V,连续输入两次就行了。

所以,一个简单的从 socket 文件读取数据的样例代码,通常是下面这样的:

char recvline[MAX_LINE_LENGTH];
int read_count;
while ((read_count = read(sock_fd, recvline, MAX_LINE_LENGTH)) > 0)
{
    printf("%s\n", "String received from server: ");
    fputs(recvline, stdout);
}

总结

所以,一定要记住这样一个概念:EOF 是一个常量而不是一个字符!。

推荐学习:《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!

Déclaration:
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