Não é possível conectar-se ao soquete unix "abstrato" do Linux

Eu estou tentando usar soquetes UNIX para comunicação entre threads. O programa destina-se apenas a rodar no Linux. Para evitar a criação dos arquivos socket, eu queria usar soquetes "abstratos", conforme documentado no unix (7).

No entanto, parece que não consigo me conectar a esses soquetes. Tudo funciona se eu estiver usando sockets "pathname", no entanto.

Aqui está o código (eu não citei nenhum tratamento de erro, mas está feito): thread # 1:

int log_socket = socket(AF_LOCAL, SOCK_STREAM, 0);
struct sockaddr_un logaddr;
socklen_t sun_len = sizeof(struct sockaddr_un);
logaddr.sun_family = AF_UNIX;
logaddr.sun_path[0] = 0;
strcpy(logaddr.sun_path+1, "futurama");
bind(log_socket, &logaddr, sun_len);
listen(log_socket, 5);
accept(log_socket, &logaddr, &sun_len);
... // send - receive

linha 2:

struct sockaddr_un tolog;
int sock = socket(AF_LOCAL, SOCK_STREAM, 0);
tolog.sun_family = AF_UNIX;
tolog.sun_path[0] = 0;
strcpy(tolog.sun_path+1, "futurama");
connect(sock, (struct sockaddr*)&tolog, sizeof(struct sockaddr_un));

Se tudo que eu faço no código acima, é mudar o sun_path para não ter o \ 0 principal, as coisas funcionam perfeitamente.

saída strace:

t1: socket(PF_FILE, SOCK_STREAM, 0)         = 0
t1: bind(0, {sa_family=AF_FILE, path=@"futurama"}, 110)
t1: listen(0, 5)
t2: socket(PF_FILE, SOCK_STREAM, 0) = 1
t2: connect(1, {sa_family=AF_FILE, path=@"futurama"}, 110 <unfinished ...>
t2: <... connect resumed> )     = -1 ECONNREFUSED (Connection refused)
t1: accept(0,  <unfinished ...>

Eu sei que a conexão vem antes de aceitar, isso não é um problema (eu tentei ter certeza que accept () é chamado antes de connect (), mesmo resultado. Além disso, as coisas estão bem se o soquete é "pathname" de qualquer maneira).

questionAnswers(4)

yourAnswerToTheQuestion