tail head cat sleep
QR code linking to this page

Man page  — VOP_LOCK

명칭

VOP_LOCK, VOP_UNLOCK, VOP_ISLOCKED, vn_lock – vnode 액세스의 직렬화

내용

서식

#include <sys/param.h>
#include <sys/lock.h>
#include <sys/vnode.h>

int
VOP_LOCK(struct vnode *vp, int flags, struct thread *td);

int
VOP_UNLOCK(struct vnode *vp, int flags, struct thread *td);

int
VOP_ISLOCKED(struct vnode *vp, struct thread *td);

int
vn_lock(struct vnode *vp, int flags, struct thread *td);

해설

이러한 호출은, 파일 시스템에의 액세스를 직렬화하기 위해서(때문에) 사용됩니다. 예를 들면, 동일 파일에 대한 2 개의 기입이 동시에 발생하는 것을 피하기 위해서(때문에) 사용합니다.

인수는 이하와 같습니다.
vp 락 또는 락 해제되는 vnode.
flags 이하의 락 요구 타입의 하나.
LK_SHARED 공유 락
LK_EXCLUSIVE 배타적 락
LK_UPGRADE 공유로부터 배타적에의 업그레이드
LK_EXCLUPGRADE 최초의 공유로부터 배타적에의 업그레이드
LK_DOWNGRADE 배타적으로부터 공유에의 다운 그레이드
LK_RELEASE 모든 락 타입의 해제
LK_DRAIN 락 상태 종료까지의 대기

락 타입은, 이하의 락 플래그와 OR 되고 있을지도 모릅니다.
LK_NOWAIT 락을 기다리기 위해서(때문에) sleep 하지 않는다
LK_SLEEPFAIL sleep 해, 실패를 돌려준다
LK_CANRECURSE 재귀적 배타적 락을 인정한다
LK_REENABLE 락 소실 후재유효화 되어야 한다
LK_NOPAUSE 표류하지 않는다

락 타입은, 이하의 제어 플래그와 OR 되고 있을지도 모릅니다.
LK_INTERLOCK 호출측이 이미 간이 락을 보관 유지하고 있을 때로 지정(VOP_LOCK 는 락을 취득한 다음에 간이 락을 해제합니다)
LK_RETRY 락 될 때까지 리트라이
LK_NOOBJ 오브젝트를 작성하지 않는다

td 락을 사용하기 위한 thread 문맥.

커널 코드는 vnode 를 잠그기 위해서(때문에) VOP_LOCK() (을)를 직접 호출하지 않고 , vn_lock() (을)를 사용해야 합니다.

반환값

성공시에는 0 이 돌려주어져 그렇지 않은 경우에는 에러가 돌려주어집니다.

유사 코드

struct vopnode {
    int von_flag;
    /*
     * 다른 파일 시스템 고유 데이터
     */
    ...;
};
#define VON_LOCKED      1
#define VON_WANTED      2
#define VTOVON(vp)      ((struct vopnode *) (vp)->v_data)

int vop_lock(struct vnode *vp) { struct vopnode* vop;

start: while (vp->v_flag & VXLOCK) {         vp->v_flag |= VXWANT;         tsleep((caddr_t) vp, PINOD, "voplk1", 0); } if (vp->v_tag == VT_NON)         return ENOENT;

vop = VTOVON(vp); if (vop->von_flag & VON_LOCKED) {         vop->von_flag |= VON_WANTED;         tsleep((caddr_t) vop, PINOD, "voplk2", 0);         goto start; }

vop->von_flag |= VON_LOCKED;

return 0; }

int vop_unlock(struct vnode *vp) { struct vopnode *vop = VTOVON(vp);

if ((vop->von_flag & VON_LOCKED) == 0) {         panic("vop_unlock not locked"); } vop->von_flag &= ~VON_LOCKED; if (vop->von_flag & VON_WANTED) {         vop->von_flag &= ~VON_WANTED;         wakeup((caddr_t) vop); }

return 0; }

int vop_islocked(struct vnode *vp) { struct vopnode *vop = VTOVON(vp);

if (vop->von_flag & VON_LOCKED)         return 1; else         return 0; }

관련 항목

vnode(9)

저자

이 메뉴얼 페이지는 Doug Rabson 하지만 썼습니다.

VOP_LOCK (9) July 24, 1996

tail head cat sleep
QR code linking to this page


Ben Bullock이 유닉스 매뉴얼 페이지에서 서비스에 대한 의견을 주시기 바랍니다. Privacy policy.

Ken Thompson has an automobile which he helped design. Unlike most automobiles, it has neither speedometer, nor gas gauge, nor any of the other numerous idiot lights which plague the modern driver. Rather, if the driver makes a mistake, a giant “?” lights up in the center of the dashboard. “The experienced driver,” says Thompson, “will usually know what's wrong.”