예를 들어 디렉터리가 아닌 파일에 대한 솔루션만 찾을 수 있습니다 lsof
. chflags
읽기 옵션이 없어 어떻게 해야 할지 모르겠습니다.
답변1
디렉터리 작업에 대한 잠금 방식은 inode별(->i_mutex) 및 파일 시스템별(->s_vfs_rename_mutex)의 두 가지 잠금을 기반으로 합니다.
디렉토리가 아닌 여러 객체에 i_mutex를 사용할 때 항상 주소가 증가하는 순서대로 잠금을 획득합니다. 아래에서는 이를 "inode 포인터" 순서라고 합니다.
우리의 목적을 위해 모든 작업은 5가지 범주로 나뉩니다.
1) 읽기 액세스. 잠금 규칙: 호출자는 우리가 액세스하는 디렉터리를 잠급니다.
2) 객체 생성. 잠금 규칙: 위와 동일합니다.
3) 개체 제거. 잠금 규칙: 호출자는 부모를 잠그고, 피해자를 찾고, 피해자를 잠그고 메서드를 호출합니다.
4) 이름 바꾸기() 즉아니요디렉터리 전체에 걸쳐. 잠금 규칙: 호출자는 상위 항목을 잠그고 소스와 대상을 찾습니다. 대상이 이미 존재하는 경우 잠급니다. 소스가 디렉터리가 아닌 경우 잠급니다. 이것이 우리가 둘 다 잠가야 한다는 것을 의미한다면, inode 포인터 순서로 잠그십시오.
5) 링크 생성. 잠금 규칙: * 상위 잠금 * 소스가 디렉터리가 아닌지 확인하세요. * 소스 잠금 * 이 메서드를 호출하세요.
6) 디렉토리 간 이름 바꾸기. 전체 무리 중에서 가장 힘든 것입니다. 잠금 규칙: * 파일 시스템 잠금 * "상위 항목 우선" 순서로 상위 항목을 잠급니다. * 소스와 타겟을 찾아보세요. * 이전 부모가 대상과 같거나 대상의 하위인 경우 -ENOTEMPTY로 실패합니다. * 새 상위가 소스와 동일하거나 소스의 하위인 경우 -ELOOP로 실패합니다. * 대상이 존재하는 경우 잠급니다. 소스가 디렉터리가 아닌 경우 잠급니다. 이것이 소스와 대상을 잠가야 한다는 것을 의미한다면 inode 포인터 순서로 이를 수행하십시오. * 이 메소드를 호출하세요.
위의 6개 디렉터리 작업의 일부 정보를 사용하여 디렉터리 잠금을 확인하는 스크립트를 작성할 수 있습니다.