문제

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 필요하지 않습니다.

여기 관련 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 미래에?

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)이 현재 또는 미래에 다른 결과를 생성할 수 있습니까(호환 구현 가정)?

미래는 미스터리입니다.오늘 나는 그것을 제외할 만큼 충분히 확신합니다.그러나 과거에는 그 ~할 것 같다 그랬어요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top