文件系统上的UNIX套接字在哪里?

时间:2013-04-11 14:45:59

标签: c sockets pipe unix-socket

我正在使用Unix域套接字。想知道它在系统中的位置。

如果我使用系统调用创建socketpair

socketpair(AF_UNIX,SOCK_STREAM,0,fd) ;

我已经读过它是未命名的套接字(一个未使用bind绑定到路径名的套接字)。 另一方面,命名套接字或更好的绑定到文件系统路径名的套接字使用bind调用get存储在我们指定的某个目录中。 例如

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

这里sun_path可以是/ tmp / sock文件。

所以,类似地,我想知道未命名的套接字在系统中的任何位置或内存或内核中的任何位置?

提前致谢。

1 个答案:

答案 0 :(得分: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;
}

这个程序说套接字没有相应的路径,所以我的猜测是unix socketpair永远不会与文件名相关联 - 它只能作为内核中的数据结构保持活动状态,直到所有引用都被关闭。 / p>

当然欢迎更好的答案:)