2010-02-18 2 views
1

저는 네트워킹 할당 작업을하고 있습니다. 우리는 주어진 프로토콜을 사용하여 원격 파일 액세스 서버를 생성해야합니다. 내 어려움은 open()에서 oflag 인수에 대한 비트를 계산하는 과정을 설명하는 정보가 부족하다는 데 있습니다.open()에서 oflag에 대한 비트 플래그/열거 플래그를 계산하는 방법은 무엇입니까?

클라이언트에서 파일을 열기 위해 메시지를 수신하고 플래그에서 oflag에 사용할 문자를 구문 분석하는 메시지에서 메시지를 봅니다. 즉 그것들은 :

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

Google과 비트 맵 연산, 열거 플래그, 비트 플래그, 비트 플래그 계산 등이 포함되어 있으며, oflag 비트를 생성하는 방법을 파악하는 데 유용한 정보를 찾을 수 없습니다. 어쩌면 나는 내가 무엇을 찾고 있으며 유용한 정보를 간과했는지 모른다.

사람 시겠어요 :

  • 포인트 나 방향/내 구문 분석 문자 나
  • 주어진 oflags에 넣어 내가한다고 비트/#을 계산하는 방법의 문서/예에 대한 링크를 제공 보여줘 플래그 그들은한다고 순서의 열거 유형은 도움을

감사 무리에 가서 내 문제 나 내가 뭘하려고에 명확하지 않은 경우 바로 알려 주시면합니다 최대한 빨리 정리할 것입니다.

답변

3

O_... 플래그는 서로 다른 단일 비트 세트가있는 숫자입니다. 내 시스템에 예를 들어 그들은 당신은 당신이 원하는 각 옵션에 설정된 모든 비트와 open에 하나의 숫자에 플래그를 결합하고 전달하는 | (논리 OR)를 사용 fcntl.h

#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 

로 정의된다. 그래서 예. open("file", O_RDWR | O_CREAT).

int를 계산하여 원하는대로 열 수 있습니다.

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

예를 들어, RWC를 구문 분석하면 열려있을 수 있습니다 (예 : "file", O_RDWR | O_CREAT). 하지만 그 이후부터는 int oflag = (02 | 0100)과 같은 식으로 문자를 알고 나서 내 열기가 열린 것처럼 보일 것입니다 ("file", oflag)? 바이너리로 파싱하는 필자의 캐릭터에서 갈 필요가있다. – Chris

0

보통 표현식은 O_RDWR | O_CREAT입니다. 그리고 O_RDWR 정확히 O_RDONLY | O_WRONLY

당신은 이런 식으로 뭔가를 할 수 있음을 유의하십시오

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

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

등 플래그의 나머지를.

+0

음 ... 아마도 나는 혼란 스러웠습니다. O_WRONLY로 파일을 열고 싶다. O_CREAT | O_APPEND, 거기에 넣을 수있는 몇 가지 int/bit 계산할 수 있습니까? 예를 들어 openg ("myfile", )를 입력하여 해당 flgas에 해당 할 수 있습니까? – Chris

+0

@Chris : 숫자가 아닌 플래그를 사용하십시오.이 경우'open ("myfile", O_WRONLY | O_CREAT | O_APPEND)'를 사용하면된다. 다른 것보다 읽기 쉽습니다. –

+1

플래그 사용 ... 플래그 비트가 모두 표준화되지 않았으므로 모든 플랫폼에서 동일한 값을 가질 것이라고 가정 할 수 없습니다. 또한 상징적 인 형식은 훨씬 더 읽기 쉽고 따라서 유지 보수가 가능합니다. 소스 코드는 컴퓨터가 아닌 사용자의 이익을위한 것입니다. –

관련 문제