2015-02-19 2 views
1

Я создал абстрактный сокет.Могу ли я удалить абстрактный путь сокета?

#define SOCKET_PATH @/tmp/xyz /*in server code of socket_server.c*/ 

int sockfd = -1; 
int len; 
struct sockaddr_un address; 
int result; 
sockfd = socket(AF_UNIX, SOCK_STREAM, 0); 
if(sockfd < -1) { 
    perror("socket:"); 
} 
memset(&address, 0, sizeof(address)); 
address.sun_family = AF_UNIX; 
strcpy(address.sun_path, SOCKET_PATH); 
address.sun_path[0]='\0'; 
len = sizeof(address); 
result = connect(sockfd, (struct sockaddr*)&address, len); 

, успешно создавая абстрактный сокет

sh-3.2# netstat -a | grep xyz 
unix 2  [ ACC ]  STREAM  LISTENING  11132 @/tmp/xyz 

Сейчас я использую один и тот же путь к файлу разъединить разъем.

#include<stdio.h> 
#define SOCKET_PATH "@/tmp/xyz" 
int main() 
{ 
     int ret; 
     ret = unlink(SOCKET_PATH); 
     if(ret == -1) 
       perror("unlink::"); 
     return 0; 
} 

, но когда я бегу мой Отмена связей код, который я получаю сообщение как:

sh-3.2# ./ulink 
unlink::: No such file or directory 

Может кто-нибудь сказать мне причину этого «Нет такого файла или каталога», и как я могу удалить/отсоединить этот абстрактный сокет извне? Есть ли какой-нибудь метод или нет?

+1

проверить/tmp/xyz, withuot @ и показать код, в котором вы вызываете функцию socket() – Darek

+0

Я попытался/tmp/xyz, и сообщение такое же, и мой снимок функции socket(): int sockfd = -1 ; int len; Адрес структуры sockaddr_un; int result; sockfd = socket (AF_UNIX, SOCK_STREAM, 0); if (sockfd <-1) { perror ("socket:"); } memset (& address, 0, sizeof (адрес)); address.sun_family = AF_UNIX; strcpy (адрес.sun_path, SOCKET_PATH); адрес.sun_path [0] = '\ 0'; len = sizeof (адрес); result = connect (sockfd, (struct sockaddr *) & address, len); – Saturn

+0

Что-то не складывается. Где находится серверный сокет? Где «слушать»? Где «связывать»? С чем связана ваша розетка? –

ответ

0

Абстрактный сокет не имеет связи с файловыми файлами (см. unix(7)), так что вы не можете использовать unlink().

Аннотация Сокет должен автоматически удаляться ядром, когда никакие процессы не используют его, поэтому для его удаления вы должны закрыть все дескрипторы сервера и клиента, ссылающиеся на сокет, или просто уничтожить все серверные и клиентские процессы.

+0

Каким будет результат, если попытаться? Другими словами, если вы взяли существующий сервер, который создает стандартный дескриптор файла сокета Unix и переключили его с помощью сокета пространства имен Linux, вам нужно будет удалить вызов unlink? – JSON

+0

@JSON unlink вернет ENOENT, потому что путь «" не существует. – gavv

Смежные вопросы