Namespaces
Variants

std::experimental::filesystem:: is_socket

From cppreference.net
ヘッダーで定義 <experimental/filesystem>
bool is_socket ( file_status s ) ;
(1) (filesystem TS)
bool is_socket ( const path & p ) ;
bool is_socket ( const path & p, error_code & ec ) ;
(2) (filesystem TS)

指定されたファイルステータスまたはパスが、POSIXの S_IFSOCK によって決定されるように、名前付きIPCソケットに対応するかどうかをチェックします。

1) 次と同等: s. type ( ) == file_type :: socket .
2) 次と同等: is_socket ( status ( p ) ) または is_socket ( status ( p, ec ) )

目次

パラメータ

s - チェックするファイルステータス
p - 検査するパス
ec - 非スローオーバーロードでのエラー報告用出力パラメータ

戻り値

true が返されるのは、 p で示されるファイル、または s で示される型が名前付きソケットを参照している場合です。例外を投げないオーバーロードは、エラーが発生した場合に false を返します。

例外

1)
noexcept 指定子:
noexcept
2) error_code & パラメータを取らないオーバーロードは、基盤OS APIエラーが発生した場合に filesystem_error をスローします。この例外は p を第一引数、OSエラーコードをエラーコード引数として構築されます。 std:: bad_alloc はメモリ確保が失敗した場合にスローされる可能性があります。 error_code & パラメータを取るオーバーロードは、OS API呼び出しが失敗した場合にそれをOS APIエラーコードに設定し、エラーが発生しなかった場合は ec. clear ( ) を実行します。このオーバーロードは
noexcept 指定子を持ちます:
noexcept

注記

名前付きソケットは、 socket および bind POSIX APIで構築されたUNIXドメインソケットであり、高度なプロセス間通信に使用されます。特に、オープン済みのファイル記述子を実行中のプロセス間で転送するために使用できます。

この関数によって提供される情報は、通常、ディレクトリ走査の副産物としても提供されます。ディレクトリ走査中、 is_socket(*iterator) を呼び出すことは、 is_socket(iterator->status()) よりも効率が劣ります。

#include <cstdio>
#include <cstring>
#include <experimental/filesystem>
#include <fstream>
#include <iostream>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/un.h>
#include <unistd.h>
namespace fs = std::experimental::filesystem;
void demo_status(const fs::path& p, fs::file_status s)
{
    std::cout << p;
    // alternative: switch(s.type()) { case fs::file_type::regular: ... }
    if (fs::is_regular_file(s))
        std::cout << " is a regular file\n";
    if (fs::is_directory(s))
        std::cout << " is a directory\n";
    if (fs::is_block_file(s))
        std::cout << " is a block device\n";
    if (fs::is_character_file(s))
        std::cout << " is a character device\n";
    if (fs::is_fifo(s))
        std::cout << " is a named IPC pipe\n";
    if (fs::is_socket(s))
        std::cout << " is a named IPC socket\n";
    if (fs::is_symlink(s))
        std::cout << " is a symlink\n";
    if (!fs::exists(s))
        std::cout << " does not exist\n";
}
int main()
{
    // create files of different kinds
    fs::create_directory("sandbox");
    std::ofstream("sandbox/file"); // create regular file
    fs::create_directory("sandbox/dir");
    mkfifo("sandbox/pipe", 0644);
    struct 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, (struct sockaddr*)&addr, sizeof addr);
    fs::create_symlink("file", "sandbox/symlink");
    // demo different status accessors
    for (auto it = fs::directory_iterator("sandbox"); it != fs::directory_iterator(); ++it)
        demo_status(*it, it->symlink_status()); // use cached status from directory entry
    demo_status("dev/null", fs::status("/dev/null")); // direct calls to status
    demo_status("dev/sda", fs::status("/dev/sda"));
    demo_status("sandbox/no", fs::status("/sandbox/no"));
    // cleanup
    close(fd);
    fs::remove_all("sandbox");
}

出力例:

"sandbox/file" is a regular file
"sandbox/dir" is a directory
"sandbox/pipe" is a named IPC pipe
"sandbox/sock" is a named IPC socket
"sandbox/symlink" is a symlink
"dev/null" is a character device
"dev/sda" is a block device
"sandbox/no" does not exist

関連項目

ファイル属性を決定する
シンボリックリンクのターゲットをチェックしてファイル属性を決定する
(関数)
ファイルタイプとパーミッションを表す
(クラス)
ファイルステータスが既知かどうかをチェックする
(関数)
指定されたパスがブロックデバイスを参照しているかチェックする
(関数)
指定されたパスがキャラクターデバイスを参照しているかチェックする
(関数)
指定されたパスがディレクトリを参照しているかチェックする
(関数)
指定されたパスが名前付きパイプを参照しているかチェックする
(関数)
引数が その他 のファイルを参照しているかチェックする
(関数)
引数が通常ファイルを参照しているかチェックする
(関数)
引数がシンボリックリンクを参照しているかチェックする
(関数)
パスが既存のファイルシステムオブジェクトを参照しているかチェックする
(関数)
このディレクトリエントリによって指定されたファイルのキャッシュされたステータス
このディレクトリエントリによって指定されたファイルのキャッシュされたシンボリックリンクステータス
( std::experimental::filesystem::directory_entry の公開メンバ関数)