Временный файл для сокета домена unix - PullRequest
1 голос
/ 15 апреля 2019

Я создаю временный файл для сокета домена unix.

int fd;
char sf[] = {"/tmp/socket-XXXXXX"};

if ((fd = mkstemp(sf)) == -1)
    exit(SOCKFERR);
close(fd);

Buf, когда я назначаю адрес сокету, мне нужно удалить этот файл (bind() функция работает, только если файл, который будет файлом сокета, еще не существует).

int sfd;
struct sockaddr_un addr;

if ((sfd = socket(PF_UNIX, SOCK_STREAM, 0)) == -1)
    exit(SOCKERR);  

unlink(sf);
memset(&addr, 0, sizeof(struct sockaddr_un));
addr.sun_family = AF_UNIX;
snprintf(addr.sun_path, 108, sf);   /* 108 is length of add.sun_path */

if (bind(sfd, (struct sockaddr *) &addr, sizeof(struct sockaddr_un)) != 0)
    exit(BINDERR);

Как создать временный файл для сокета домена unix, не удаляя его до bind()?

1 Ответ

1 голос
/ 15 апреля 2019

Как создать временный файл для сокета домена unix, не удаляя его перед bind ()?

Это невозможно.Все в Linux является файлом.«Сокет» - это «файл сокета».С mkstemp вы создаете то, что называется «обычный файл» или «обычный файл».

Если вы создадите обычный файл и попытаетесь создать каталог с тем же путем, вы получите ошибку EEXISTS,Вы должны удалить файл, а затем создать каталог.

Точно так же происходит, когда вы пытаетесь создать файл сокета с тем же именем, что и существующий обычный файл - файл там уже существует.При попытке создать символическую ссылку или жесткую ссылку или «символьное устройство» («символьный специальный файл») или любой другой тип файла.Вы должны удалить существующий файл, а затем создать другой тип файла.

...