2013-04-11 1 views
2

Unix 도메인 소켓을 사용하고 있습니다. 시스템에서의 위치를 ​​알고 싶습니다.파일 시스템의 UNIX 소켓은 어디에 있습니까?

내가 그것을 읽고 시스템 호출

socketpair(AF_UNIX,SOCK_STREAM,0,fd) ; 

를 사용하여 socketpair의를 작성하고있는 경우는 익명의 소켓 (바인딩을 사용하여 경로 이름 바인드되지 않은 소켓)입니다. 반면에 named라는 이름의 소켓은 bind 호출을 사용하여 파일 시스템 경로 이름에 바인드 된 소켓을 지정하는 일부 디렉토리에 저장됩니다. 예를

여기
struct sockaddr_un { 
       sa_family_t sun_family;    /* AF_UNIX */ 
       char  sun_path[UNIX_PATH_MAX]; /* pathname */ 
      }; 

sun_path 수 있습니다/tmp를/양말 파일 .

마찬가지로, 이름없는 소켓이 시스템이나 메모리 또는 커널의 어느 위치에 있는지 알고 싶습니까?

미리 감사드립니다.

+0

'어디에서'를 의미합니까? FD는 커널 데이터 구조에 대한 핸들입니다. 소켓 FD를 포함한 모든 FD에 적용되며, 이름없는 유닉스 소켓에 대해서는 소켓 FD를 포함합니다. 이름이 없다는 것은 아무 관련이 없습니다. – EJP

+0

@EJP : 어떤 데이터 구조 나 그 FD 테이블이 무엇인지 알 수는 없습니다. –

답변

4

나는 커널 전문가가 아니므로, 이것을 (교육받은?) 추측으로 생각하십시오.

#include <sys/un.h> 
#include <sys/socket.h> 
#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    struct sockaddr_un sun; 
    socklen_t socklen; 
    int fd[2]; 
    if(socketpair(AF_UNIX,SOCK_STREAM,0,fd) < 0) { 
     perror("socketpair"); 
     return 111; 
    } 
    socklen = sizeof(sun); 
    memset(&sun, 0, sizeof sun); 
    sun.sun_path[0] = '!'; /* replace with any character */ 
    if(getsockname(fd[0], (struct sockaddr *)&sun, &socklen) < 0) { 
     perror("getsockname"); 
     return 111; 
    } 
    printf("sunpath(%s)\n", sun.sun_path); 
    return 0; 
} 

이 프로그램은 내 생각 엔이 유닉스 socketpair의이 파일 이름과 연관되지 않습니다 것입니다 수 있도록 소켓, 해당 경로가없는 말한다 - 그것은 단지 모든 참조 될 때까지 커널 내부 데이터 구조로 살아 유지 닫혀있다.

더 나은 대답은 물론 환영합니다 :)

관련 문제