2010-02-18 4 views
1

Je travaille sur une tâche de mise en réseau et nous sommes chargés de créer un serveur d'accès aux fichiers à distance avec un protocole qui nous a été donné. Mes difficultés viennent du manque d'informations que je peux trouver qui explique le processus de calcul des bits pour l'argument oflag dans open().Comment calculer les drapeaux de bit/enum flags pour oflag dans open()?

Je reçois un message d'un client pour ouvrir un fichier et dans le message j'analyse les caractères pour les indicateurs à utiliser dans oflag. ils sont en particulier:

  • R - O_RDONLY
  • W - O_WRONLY
  • RW - O_RDWR
  • A - O_APPEND
  • C - O_CREAT
  • T - O_TRUNC
  • E - O_EXCL

J'ai contourné Google et s recherche les opérations au niveau du bit, les drapeaux d'énumération, les drapeaux de bit, le calcul des drapeaux de bit, etc. et n'a pas pu trouver quelque chose d'utile pour déterminer comment créer les bits pour oflag. Peut-être que je ne savais pas ce que je cherchais et que j'ignorais des informations utiles?

Quelqu'un pourrait-il s'il vous plaît:

  • point moi dans la direction/fournir des liens vers la documentation/exemple de la façon de calculer les bits/# je dois mettre en oflags étant donné mes personnages analysables ou
  • Montrez-moi les types d'énumération pour les drapeaux et l'ordre qu'ils devraient aller dans

Merci un bouquet pour vous aider et si je n'étais pas clair sur mon problème ou ce que je suis en train de faire, me savoir et je clarifiera ASAP.

Répondre

3

Les drapeaux O_... sont des nombres ayant chacun un jeu de bits unique différent. Par exemple sur mon système, ils sont définis dans fcntl.h comme

#define O_RDONLY    00 
#define O_WRONLY    01 
#define O_RDWR    02 
#define O_CREAT   0100 /* not fcntl */ 
#define O_EXCL    0200 /* not fcntl */ 
#define O_NOCTTY   0400 /* not fcntl */ 
#define O_TRUNC   01000 /* not fcntl */ 
#define O_APPEND   02000 

Vous utilisez | (logique) de combiner les drapeaux et passer dans un seul numéro à open avec tous les bits définis pour chaque option. Ainsi, par exemple open("file", O_RDWR | O_CREAT).

Vous pouvez calculer un int et le passer en open aussi si vous le souhaitez.

int flags = 0; 
if (...) 
    flags |= O_RDWR; 
... 
open('file', flags); 
+0

Par exemple, si j'ai analysé RWC, il serait ouvert ("fichier", O_RDWR | O_CREAT). Mais puisque je connais seulement les caractères, est-ce que je ferais quelque chose comme int oflag = (02 | 0100) et alors mon ouverture ressemblerait à open ("file", oflag)? Je dois aller de mes personnages que j'analyse à binaire. – Chris

0

L'expression usuelle serait quelque chose comme O_RDWR | O_CREAT. Et notez que O_RDWR est exactement O_RDONLY | O_WRONLY

Vous pouvez faire quelque chose comme ceci:

char *flags = "r"; 
int oflag = 0; 

if (strchr(flags,'r')) oflag |= O_RDONLY; 

et ainsi de suite pour le reste des drapeaux.

+0

Ummmm ... Peut-être que j'étais un peu déroutant. Disons que je voulais ouvrir un fichier avec O_WRONLY | O_CREAT | O_APPEND, y a-t-il et comment puis-je calculer quelques int/bits à mettre? Par exemple pourrais-je entrer open ("myfile", ) qui correspondrait à ces flgas? – Chris

+0

@Chris: Utilisez les drapeaux, pas le nombre.Vous utiliseriez 'open (" myfile ", O_WRONLY | O_CREAT | O_APPEND)' dans ce cas. C'est plus facile à lire, si rien d'autre. –

+1

Utilisez les drapeaux ... ces bits de drapeaux ne sont pas tous standardisés, donc vous ne pouvez pas supposer qu'ils auront la même valeur sur chaque plate-forme. En outre, la forme symbolique est beaucoup plus lisible et donc maintenable ... le code source est à votre avantage, pas la machine. –

Questions connexes