fcntl 예제

지정된 파일 설명자가 참조하는 파일에 대한 파일 세그먼트 잠금을 설정하거나 지웁습니다. 인수는 나중에 설명한 형식 구조형 무리의 변수에 대한 포인터입니다. F_SETLK는 공유(또는 읽기) 잠금(F_RDLCK) 또는 배타적(또는 쓰기) 잠금(F_WRLCK)을 설정하고 두 유형의 잠금(F_UNLCK)을 제거하는 데 사용됩니다. 반환 값은 성공 시 0, 오류시 -1입니다. 잠금을 즉시 가져올 수 없는 경우 fcntl()은 Errno를 EACCES로 설정한 후 -1로 반환합니다. 알림은 신호 전달을 통해 발생합니다. 기본 신호는 SIGIO이지만 F_SETIG 명령을 사용하여 fcntl()으로 변경할 수 있습니다. 후자의 경우 신호 처리기는 siginfo_t 구조를 두 번째 인수로 수신하고(SA_SIGINFO를 사용하여 처리기가 설정된 경우) 이 구조의 si_fd 필드에는 알림을 생성한 파일 설명자가 포함되어 있습니다(유용할 때 여러 디렉터리에 알림을 설정합니다) int fcntl (int fd, int cmd); int fcntl (int fd, int cmd, 긴 아르그); int fcntl (int fd, int cmd, 구조형 무리 *자물쇠); 명령이 F_SETLKW이고 프로세스가 다른 프로세스가 잠금을 해제할 때까지 기다려야 하는 경우 잠글 바이트 범위는 fcntl() 함수 블록 앞에 결정됩니다. fcntl()이 차단되는 동안 파일 크기 또는 파일 설명자가 오프셋 변경을 요청하는 경우 잠긴 바이트 범위에는 영향을 주지 않습니다. 열려 있는 각 파일 설명에는 open(2)에 의해 초기화되고 fcntl(2)에 의해 수정될 수 있는 특정 관련 상태 플래그가 있습니다. 중복된 파일 설명자(dup(), fcntl(F_DUPFD), fork(등)은 동일한 열려 있는 파일 설명을 참조하므로 동일한 파일 상태 플래그를 공유합니다. 커널 2.0이기 때문에 flock(2)과 fcntl(2)에 의해 배치된 잠금 유형 간에는 상호 작용이 없습니다. 자문 파일 레코드 잠금이 효과적이려면 파일에 액세스할 수 있는 모든 프로세스가 파일에 대한 I/O를 수행하기 전에 자문 메커니즘을 협력하고 사용해야 합니다.

적용 모드 레코드 잠금은 모든 프로세스가 작동한다고 가정할 수 없는 경우에 중요합니다. 예를 들어 한 사용자가 편집기를 사용하여 두 번째 사용자가 동일한 파일을 업데이트하는 다른 프로세스를 실행하는 동시에 파일을 업데이트하고 두 프로세스 중 하나만 권고 잠금을 사용하는 경우 프로세스가 작동하지 않습니다. 적용 모드 레코드 잠금은 우발적인 충돌로부터 보호합니다. fcntl()은 열려 있는 파일 설명자 fd에서 아래에 설명된 작업 중 하나를 수행합니다. 작업은 cmd에 의해 결정됩니다. 다음 예제에서는 파일의 바이트 100~109에 잠금을 배치한 다음 나중에 제거하는 방법을 보여 줍니다. F_SETLK는 호환되지 않는 잠금이 다른 프로세스에 의해 유지되는 경우 프로세스가 기다릴 필요가 없도록 비차단 잠금 요청을 수행하는 데 사용됩니다. 대신 프로세스가 다른 작업을 수행 할 수 있습니다. 둘째, 권고 레코드 잠금을 사용 하 여 잠금 각 I/O 작업을 잠금 (또는 테스트) 및 잠금 해제 작업을 브래킷을 사용 하 여 프로세스가 필요 합니다. 적용 모드 파일 및 레코드 잠금을 사용하면 프로세스가 파일을 한 번 잠그고 모든 I/O 작업이 완료되면 잠금을 해제할 수 있습니다. 적용 모드 레코드 잠금은 향상될 수 있는 기반을 제공합니다. 예를 들어, 검색 가능한 잠금이 있습니다.

즉, 다른 프로세스가 파일을 읽을 수 있도록 프로세스가 파일을 잠글 수 있도록 메커니즘을 향상시킬 수 있지만 아무도 파일을 쓸 수 없습니다. 잠긴 영역을 제어하는 프로세스가 다른 프로세스의 잠긴 영역을 잠급니다 절전 모드로 이동하면 교착 상태가 발생할 수 있습니다.