int fcntl(int fd, int command, ... /* arg */ );
Это портативно: flags = fcntl(fd, F_GETFL);
(примечание: нет arg
)?
Оба Linux и FreeBSD справочные страницы говорят, что arg
игнорируется:
F_GETFL (void)
Get the file access mode and the file status flags; arg
is ignored.
void
в документации Linux означает, что arg
не требуется.
Вот пример использования POSIX для связанного флага F_GETFD
:
#include <unistd.h>
#include <fcntl.h>
...
int flags;
flags = fcntl(fd, F_GETFD);
if (flags == -1)
/* Handle error */;
flags |= FD_CLOEXEC;
if (fcntl(fd, F_SETFD, flags) == -1)
/* Handle error */;"
Это показывает, что arg
не требуется для F_GETFD
(сегодня). Затем он говорит:
Значения arg для F_GETFD, F_SETFD, F_GETFL и F_SETFL представляют собой значения флагов для обеспечения возможности расширения в будущем.
Означает ли это, что F_GETFL
может использовать arg
в будущем?
Быстрый поиск "F_GETFL" в коде Ohloh создает впечатление, что большинство проектов с открытым исходным кодом проходят arg
(обычно 0
, иногда NULL
или даже (неверно?) &fl
). Я не понимаю, почему fcntl(fd, F_GETFL, 0)
предпочтительнее. @Wumpus Q. Wumbley предлагает что это может быть вызвано книга "Advanced Programming in the UNIX Environment", в которой также используется форма fcntl(fd, F_GETFL, 0)
.
Есть ли система/компилятор, для которого требуется третий аргумент: flags = fcntl(fd, F_GETFL, 0);
? Могут ли fcntl(fd, F_GETFL)
и fcntl(fd, F_GETFL, 0)
давать разные результаты сегодня или в будущем (при соответствующей реализации)?
flags = fcntl(fd, F_GETFL);
? Или вместо этого следует использоватьflags = fcntl(fd, F_GETFL, 0);
, например, для переносимости? Примечание: POSIX показывает пример дляF_GETFD
, но я спрашиваю оF_GETFL
. - person jfs   schedule 31.07.2014fcntl
восходит к 4.2BSD. - person Roland Smith   schedule 04.08.20140
используется APUE как указал @Wumpus Q. Wumbley, и поэтому люди могут копировать код, не понимая его (я не вижу никаких указаний на то, что0
необходим в любой системе/компиляторе). - person jfs   schedule 05.08.20140
в кодовой базе? - person jfs   schedule 05.08.2014