2016-06-18 6 views
0

나는 filedescriptor 플래그를 설정하고 가져 오는 데 fcntl(fd, F_SETFD, flg)flg = fcntl(fd, F_GETFD, flg)을 사용할 수 있다는 인상을 받았습니다.리눅스에서 FD 플래그 설정

https://community.spiceworks.com/linux/man/2/fcntl에 따르면 linux는 일부 fd 플래그 설정 만 지원해야합니다. 공정하다. 그러나 는의 출력에 의해 판단 :

#define _GNU_SOURCE 
#include <unistd.h> 
#include <sys/types.h> 
#include <fcntl.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <errno.h> 

#define XSZ(x) (int)(sizeof(x)*2) 
int main(int argc, char** argv){ 
    int fd, flg; 
    if ((fd = open("/dev/stdout", O_RDWR)) < 0){ perror("open"); return -errno; } 

    //get 
    if ((flg = fcntl(fd, F_GETFD)) < 0){ perror("setfd"); return -errno; } 
    printf("flg=0x%0*x\n", XSZ(flg), flg); 

#define ADD_FLAG(FLG) \ 
    flg |= FLG;\ 
    printf("setting flg=0x%0*x\n", XSZ(flg), flg);\ 
    if ((flg = fcntl(fd, F_SETFD, flg))){ perror("setfd"); return -errno; }\ 
    if ((flg = fcntl(fd, F_GETFD, flg)) < 0){ perror("getfd"); return -errno; }\ 
    printf("flg=0x%0*x\n\n", XSZ(flg), flg); 

    ADD_FLAG(FD_CLOEXEC); 
    ADD_FLAG(O_APPEND); 
    ADD_FLAG(O_DIRECT); 
    ADD_FLAG(O_ASYNC); 
    ADD_FLAG(O_NOATIME); 

    return 0; 
} 

유일한 설정 가능 플래그가 FD_CLOEXEC입니다처럼 보이는

flg=0x00000000 
setting flg=0x00000001 
flg=0x00000001 

setting flg=0x00000401 
flg=0x00000001 

setting flg=0x00004001 
flg=0x00000001 

setting flg=0x00002001 
flg=0x00000001 

setting flg=0x00040001 
flg=0x00000001 

서비스를 제공합니다. (이상한 점 : 모든 전화는 번을 성공적으로 반환합니다.).

https://github.com/torvalds/linux/blob/master/fs/fcntl.c#L259

여기 무슨 일이야 :

그리고 커널처럼 나에게 보이는 거의 F_SETFD의 인자를 무시? 내가 놓친 게 있니?

답변

2

F_SETFD의 유일한 유효한 플래그는FD_CLOEXEC입니다. 사용하는 다른 모든 것은 F_SETFL입니다. F_SETFD에 존재하지 않는 플래그 값이 전달 될 때 Linux 나 POSIX 모두 오류를 지정하지 않으므로 오류가 발생하지 않을 것으로 예상됩니다.