2016-06-18 3 views
0

У меня создалось впечатление, что fcntl(fd, F_SETFD, flg) и flg = fcntl(fd, F_GETFD, flg) могут использоваться для установки и получения флажков filedescriptor.Установка флагов FD в Linux

Согласно 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; 
} 

быть

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 

Похоже, единственный устанавливаемое флаг FD_CLOEXEC. (Странная вещь: все заданные вызовы возвращают успешно).

И он смотрит на меня, как ядро ​​в значительной степени игнорируют аргументы F_SETFD:

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

Что здесь происходит? Я что-то упускаю?

ответ

2

Подходит только для: F_SETFDявляетсяFD_CLOEXEC; все остальные вы используете для F_SETFL. Ни Linux, ни POSIX не указывают какую-либо ошибку, когда F_SETFD передает любые значения для флагов, которые не существуют, поэтому ожидается, что такая ситуация не приведет к ошибке.

Смежные вопросы