Namespaces
Variants

std::filesystem:: is_socket

From ru.cppreference.net
Определено в заголовке <filesystem>
bool is_socket ( std:: filesystem :: file_status s ) noexcept ;
(1) (начиная с C++17)
bool is_socket ( const std:: filesystem :: path & p ) ;
(2) (начиная с C++17)
bool is_socket ( const std:: filesystem :: path & p, std:: error_code & ec ) noexcept ;
(3) (начиная с C++17)

Проверяет, соответствует ли данный статус файла или пути именованному IPC-сокету, как если бы это определялось POSIX S_IFSOCK .

1) Эквивалентно s. type ( ) == file_type :: socket .
2,3) Эквивалентно is_socket ( status ( p ) ) или is_socket ( status ( p, ec ) ) .

Содержание

Параметры

s - статус файла для проверки
p - путь для проверки
ec - выходной параметр для сообщения об ошибках в непорождающей перегрузке

Возвращаемое значение

true если файл, указанный в p или если тип, указанный в s ссылается на именованный сокет. Перегрузка без генерации исключений возвращает false при возникновении ошибки.

Исключения

Любая перегрузка, не помеченная noexcept , может выбрасывать std::bad_alloc при неудачном выделении памяти.

2,3) Устанавливает параметр std:: error_code & в код ошибки API операционной системы при сбое вызова API ОС, и выполняет ec. clear ( ) если ошибок не возникает.

Примечания

Именованные сокеты — это сокеты домена UNIX, созданные с помощью socket и bind POSIX API, которые могут использоваться для расширенного межпроцессного взаимодействия. В частности, они могут применяться для передачи открытых файловых дескрипторов из одного выполняемого процесса в другой.

Пример

#include <cstdio>
#include <cstring>
#include <filesystem>
#include <fstream>
#include <iostream>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/un.h>
#include <unistd.h>
namespace fs = std::filesystem;
void demo_status(const fs::path& p, fs::file_status s)
{
    std::cout << p;
    // альтернатива: switch(s.type()) { case fs::file_type::regular: ...}
    if (fs::is_regular_file(s))
        std::cout << " является обычным файлом\n";
    if (fs::is_directory(s))
        std::cout << " является директорией\n";
    if (fs::is_block_file(s))
        std::cout << " является блочным устройством\n";
    if (fs::is_character_file(s))
        std::cout << " является символьным устройством\n";
    if (fs::is_fifo(s))
        std::cout << " является именованным IPC-каналом\n";
    if (fs::is_socket(s))
        std::cout << " является именованным IPC-сокетом\n";
    if (fs::is_symlink(s))
        std::cout << " является символьной ссылкой\n";
    if (!fs::exists(s))
        std::cout << " не существует\n";
}
int main()
{
    // создание файлов различных типов
    fs::create_directory("sandbox");
    fs::create_directory("sandbox/dir");
    std::ofstream{"sandbox/file"}; // создание обычного файла
    fs::create_symlink("file", "sandbox/symlink");
    mkfifo("sandbox/pipe", 0644);
    sockaddr_un addr;
    addr.sun_family = AF_UNIX;
    std::strcpy(addr.sun_path, "sandbox/sock");
    int fd = socket(PF_UNIX, SOCK_STREAM, 0);
    bind(fd, reinterpret_cast<sockaddr*>(&addr), sizeof addr);
    // демонстрация различных методов доступа к статусу
    for (auto it{fs::directory_iterator("sandbox")}; it != fs::directory_iterator(); ++it)
        demo_status(*it, it->symlink_status()); // использование кэшированного статуса из записи директории
    demo_status("/dev/null", fs::status("/dev/null")); // прямые вызовы status
    demo_status("/dev/sda", fs::status("/dev/sda"));
    demo_status("sandbox/no", fs::status("/sandbox/no"));
    // очистка (предпочтительно использовать пользовательские удалители на основе std::unique_ptr)
    close(fd);
    fs::remove_all("sandbox");
}

Возможный вывод:

"sandbox/file" является обычным файлом
"sandbox/dir" является директорией
"sandbox/pipe" является именованным IPC-каналом
"sandbox/sock" является именованным IPC-сокетом
"sandbox/symlink" является символьной ссылкой
"/dev/null" является символьным устройством
"/dev/sda" является блочным устройством
"sandbox/no" не существует

Смотрите также

(C++17) (C++17)
определяет атрибуты файла
определяет атрибуты файла, проверяя цель символьной ссылки
(функция)
представляет тип файла и права доступа
(класс)
проверяет, известен ли статус файла
(функция)
проверяет, ссылается ли данный путь на блочное устройство
(функция)
проверяет, ссылается ли данный путь на символьное устройство
(функция)
проверяет, ссылается ли данный путь на директорию
(функция)
(C++17)
проверяет, ссылается ли данный путь на именованный канал
(функция)
(C++17)
проверяет, ссылается ли аргумент на другой файл
(функция)
проверяет, ссылается ли аргумент на обычный файл
(функция)
(C++17)
проверяет, ссылается ли аргумент на символьную ссылку
(функция)
(C++17)
проверяет, ссылается ли путь на существующий объект файловой системы
(функция)
проверяет, ссылается ли запись директории на именованный IPC-сокет
(публичная функция-член std::filesystem::directory_entry )