F_GETFL fcntl 명령에 대한 인수는 언제 필요합니까?
문제
int fcntl(int fd, int command, ... /* arg */ );
휴대용인가요? flags = fcntl(fd, F_GETFL);
(메모:아니요 arg
)?
둘 다 리눅스 그리고 FreeBSD 맨 페이지에는 다음과 같은 내용이 나와 있습니다. arg
무시됩니다:
F_GETFL (void)
Get the file access mode and the file status flags; arg
is ignored.
void
Linux 문서에서는 다음을 의미합니다. arg
필요하지 않습니다.
#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
미래에?
Ohloh 코드에서 "F_GETFL"을 빠르게 검색하면 다음과 같은 인상을 받습니다. 대부분의 오픈 소스 프로젝트는 통과합니다. arg
(대개 0
, 때때로 NULL
, 또는 심지어 (깨진?) &fl
).왜인지 이해가 안 돼요 fcntl(fd, F_GETFL, 0)
선호되는 형태입니다. @Wumpus Q.Wumbley가 제안한 그로 인해 발생할 수도 있다고 "UNIX 환경의 고급 프로그래밍" 서적 그것도 사용 fcntl(fd, F_GETFL, 0)
형태.
세 번째 인수가 필요한 시스템/컴파일러가 있습니까? flags = fcntl(fd, F_GETFL, 0);
?할 수 있다 fcntl(fd, F_GETFL)
그리고 fcntl(fd, F_GETFL, 0)
현재 또는 미래에 다른 결과를 생성합니까(규정 준수 구현을 가정)?
해결책
나머지 fcntl 명령을 살펴보세요.그 중 일부(F_DUPFD, F_SETFL 및 기타)가 세 번째 인수의 용도를 어떻게 알려주는지 확인하세요.그 중 하나를 사용할 때는 세 번째 인수를 제공해야 합니다.F_GETFL 또는 F_GETFD를 사용할 때는 그렇지 않습니다.
개요에서 fcntl이 인수 2개와 인수 1개를 사용하는 것을 볼 수 있습니다. ...
이는 세 번째 인수가 사용되지 않을 때 생략될 수 있음을 의미합니다.
좀 더 조사한 후, 개요에서 3가지 인수가 모두 필요함을 암시하는 오래된 매뉴얼 페이지(첫 번째 APUE 무렵부터)가 있다는 것을 발견했습니다.예: http://www.freebsd.org/cgi/man.cgi?query=fcntl&manpath=FreeBSD+2.2.7-RELEASE
SYNOPSIS
#include <fcntl.h>
int
fcntl(int fd, int cmd, int arg);
헤더에서 실제로 그런 식으로 선언되었다는 증거를 찾을 수 없지만 만약 그렇다면 2개의 인수만으로 호출되면 컴파일이 실패합니다.이는 코드에 추가 0 인수를 포함하는 것이 좋은 이유입니다.
내 추측이 정확하고 이것이 3-arg F_GETFL의 역사적 사용에 대한 실제 이유라면 함수 프로토타입이 새롭고 무서웠고 OS 공급업체가 이를 잘못 이해했던 시대의 쓸모없는 화석입니다.
다른 팁
FreeBSD 기본 시스템에서는 두 가지 모두 fcntl(fd, F_GETFL)
그리고 fcntl(fd, F_GETFL, 0)
사용됩니다.그러나 대부분의 경우 세 번째 인수 0이 사용됩니다.이는 역사적 이유 때문일 수 있습니다. fcntl
4.2BSD로 거슬러 올라가며 4.4BSD-Lite 소스 코드를 통해 FreeBSD로 가져왔습니다.
4.4BSD(및 FreeBSD 2.0)에서 매뉴얼 페이지에는 인수가 다음과 같이 나열되어 있습니다. 필수적인: int fcntl(int fd, int cmd, int arg)
, 실제 구식 헤더가 그렇더라도 ~ 아니다: int fcntl(int, int, ...)
.
에 관해서는 왜, 그건 대답하기 어려울 것 같아요.원저자에게 물어봐야 할 것 같습니다.그러나 원본 소스 제어 태그에 기록된 (사용자) 이름이 없기 때문에 이를 추적하는 방법을 알 수 없습니다.
추가 0 인수는 아마도 FreeBSD 코드베이스에서 제거되지 않았을 것입니다. 왜냐하면 이는 아무 것도 손상시키지 않고 "수정"할 만큼 중요하지 않기 때문입니다.
이 두 가지 호출
flags = fcntl(fd, F_GETFL);
flags = fcntl(fd, F_GETFL, 0);
세 번째 가변 매개변수가 무시되기 때문에 동일합니다.살펴보시면 fs/fcntl.c
:262 그리고 fs/fcntl.c
:269 당신은 그것을 볼 것입니다 arg
사용되지 않습니다.
그러나 어떤 값을 설정해야 하는 경우에는 설정하려는 값을 전달해야 합니다.
당신은 고려할 수 있습니다 fcntl
getter 및 setter에 해당하는 OOP입니다.
세 번째 인수가 필요한 시스템이 있습니까?플래그 = fcntl(fd, F_GETFL, 0);?
나는 아무것도 모른다.적어도 리눅스는 그렇지 않습니다.문서에는 다음을 사용하지 않으므로 무시된다고 명시되어 있습니다. arg
.무언가를 통과할 수 있다는 사실이 반드시 통과해야 한다는 것을 의미하지는 않습니다.
할 수 있다
fcntl(fd, F_GETFL)
그리고fcntl(fd, F_GETFL, 0)
일부 시스템(과거, 현재, 미래(적합성 구현 가정))에서 다른 결과를 반환합니까?
lxr
이전 버전의 Linux를 파헤쳐 볼 수 있으며 심지어 1991년 Linux 2.0.4에서도 fcntl
세 번째 인수를 통과했습니다.더 이상 논쟁을 받아들인다는 의미는 없습니다.따라서 세 번째 주장에 의미가 있는 시스템이 있다면 그것은 확실히 Linux가 아닙니다.
좀 더 자세히 조사해 본 결과 상충되는 결과를 발견했습니다.보다 여기:책이 몇 권 있습니다. (아마도 책에 대한 직접적인 링크는 게시하지 않습니다.) protected
) 제안하는 것 fcntl
세 개의 인수 함수로.하지만 적어도 관련해서는 GETFL
/GETFD
,에 대해서는 언급이 없습니다. arg
.
IMHO, 그 행동은 심각하게 받아들여진 적이 없습니다:즉, 무엇이 당신을 궁금하게 만드는가입니다.게다가 나는 세 번째 주장을 사용하는 것도 해롭다고 생각합니다.그것이 의미가 있거나 의미가 있다면 어떨까요?
나는 Linux를 다시 살펴보았는데 해당 명령에 대한 세 번째 인수는 전달되지 않았습니다.
마지막으로
세 번째 인수가 필요한 시스템/컴파일러가 있습니까?플래그 = fcntl(fd, F_GETFL, 0);?fcntl(fd, F_GETFL) 및 fcntl(fd, F_GETFL, 0)이 현재 또는 미래에 다른 결과를 생성할 수 있습니까(호환 구현 가정)?
미래는 미스터리입니다.오늘 나는 그것을 제외할 만큼 충분히 확신합니다.그러나 과거에는 그 ~할 것 같다 그랬어요.