2014-04-27 5 views
2

현재 fatrace의 소스 코드를 검사하고 있습니다.파일 이름을 가져 오는 것을 fanotify하는 이유는/proc/self/fd/"data-> fd"입니까?

res = read (fan_fd, buffer, 4096); 
    ... 
    data = (struct fanotify_event_metadata *) buffer; 
    while (FAN_EVENT_OK (data, res)) { 
     ... 
     data = FAN_EVENT_NEXT (data, res); 
    } 

이 이벤트와 관련된 이름을 추출에 도달 코드는 다음과 같다 :

snprintf (printbuf, sizeof (printbuf), "/proc/self/fd/%i", data->fd); 
    len = readlink (printbuf, pathname, sizeof (pathname)); 

데이터의 값을 구하는 fanotify 호출 메인 루프 같다 파일명이 /proc/self/fd/"data->fd"에서 추출되었고 /proc/"data->pid"/fd/"data->fd"이 아닌 이유가 혼란 스럽습니다.

+0

주관적인 질문입니까? 둘 다 동일합니다. 어떤 경우에는 OS가 PID를 대체하고 다른 경우에는 프로그래머가 대체합니다. – MSalters

+1

그들은 같은가요? 나의 이해는/proc/self/fd/"fd"가 snprintf를 호출하는 프로세스에서 파일을 참조한다는 것이다. 그러나 data-> pid는 fan_event를 생성하는 프로세스를 나타내며, 이는 동일 할 수도 있지만 일반적으로 그렇지 않습니다. –

+0

@MSalters는 둘 다 동일하지 않습니다. 'data-> pid'는 현재 프로세스의 pid가 아니라 파일 활동이있는 프로세스의 PID입니다. – craig65535

답변

0

data->pid은 파일 디스크립터 집합이 다른 다른 프로세스이기 때문입니다. fanotify에서 반환 한 data->fd은 현재 프로세스에서 유효하며 모니터링되는 프로세스에서는 유효하지 않습니다.