2013-05-15 5 views

답변

0

fcntl() 기능이 열려 기술자에 다양한 작업을 수행합니다. 그것의 구문은 다음과 같습니다

  • -1

    다음 fcntl() 실패했습니다 :

    int fcntl(int descriptor, 
          int command, 
          ...) 
    

    에 대한 반환 값를 참조하십시오. errno 글로 z 변수는 오류를 나타내도록 설정됩니다.

이 코드 :

#include <sys/types.h> 
#include <unistd.h> 
#include <fcntl.h> 
int main(){ 
    int flags; 
    if((flags = fcntl(-1,F_GETFL,0)) < 0){ 
    perror("fcntl: "); 
    } 
    printf("\n %d\n", flags); 
} 

출력은 다음과 같습니다 fcntl(-1,F_GETFL,0); 때문에 -1의 성공하지 전화를 나타내는 인쇄 flags 값이 -1입니다

~$ gcc xx.c 
~$ ./a.out 
fcntl: : Bad file descriptor 

-1 

주의가 유효한 파일 기술자가 아니다. valid file descriptors0부터 시작합니다. (즉, perror()은 오류 메시지 Bad file descriptor, EBADF를 출력합니다)

참고 :이 코드는 Linux 시스템에서 실행됩니다.

편집 : F_GETFL
는 GET 플래그입니다은 fcntl을에서() 명령.

+0

를, 내가 알고하자 이것에 대해 더 많은 도움이 필요합니다. –

4

F_GETFL 플래그 fcntl()을 호출하는 일반적인 이유는 플래그를 수정하고 fcntl()F_SETFL로 설정하는 것입니다; fcntl()F_GETFL으로 호출하는 또 다른 이유는 파일 설명 자의 특성을 찾는 것입니다. <fcntl.h>에 대한 정보를 (신중하게) 읽음으로써 조작 할 수있는 플래그에 대한 정보를 찾을 수 있습니다. 플래그는 다음을 포함합니다 :

  • O_APPEND - 추가 모드를 설정합니다.
  • O_DSYNC - 동기화 된 I/O 데이터 무결성 완료에 따라 쓰기.
  • O_NONBLOCK - 비 차단 모드입니다.
  • O_RSYNC - 동기화 된 읽기 I/O 작업.
  • O_SYNC - 동기화 된 I/O 파일 무결성 완료에 따라 쓰기.

플러스 (POSIX 2008)를 구별 할 수 있습니다 O_ACCMODE O_RDONLY, O_RDWRO_WRONLY, 내가 제대로 참조 된 페이지를 읽고 있어요 경우.

그러나 fcntl()-1과 같이 명확하게 잘못된 파일 설명자와 함께 호출하는 것은 의미가 없습니다. 함수가 실패를 나타내는 -1을 반환하고 errnoEBADF (잘못된 파일 설명자)으로 설정하면됩니다.

flags = fcntl(-1,F_GETFL,0); 

시도가 유효하지 않은 파일 기술자 (-1)에 대한 몇 가지 작업을 수행 할 수 있으므로 다른 어떤하지만 -1 반환을하지 않고 errno을 설정 않을 것입니다 : 우리 가정

3

man 2 fcntl에 의해 기술 된 기능에 대해 얘기 EBADF.

난 당신이 savely하여이 줄을 바꿀 수 있습니다 말하고 싶지만 : 그래서 코드의 목적은 아무것도 없지만 -1`가 유효한 파일 기술자 : 아니다`보여줍니다

flags = -1; errno = EBADF;