namespace std::filesystem {
bool is_socket(file_status s) noexcept; // (1)
bool is_socket(const path& p); // (2)
bool is_socket(const path& p, std::error_code& ec) noexcept; // (3)
}
概要
指定されたパスがソケットを指しているかを確認する。
戻り値
- (1) :
return s.type() == file_type::socket;
- (2) :
return is_socket(status(p));
- (3) :
file_status s = status(p, ec); if (ec) { return false; } // ファイルが見つからなかったらエラー file_type type = s.type(); if (type == file_type::none || file_type::not_found || file_type::unknown) { ec = implementation-defined; return false; } ec.clear(); return is_socket(s);
例外
- (1) : 投げない
- (2) : ファイルシステムがエラーを報告する場合がある。それに加えて、指定されたファイルの種別が
file_type::none
、file_type::not_found
、file_type::unknown
のいずれかである場合もエラーである。エラーが発生した場合は、std::filesystem::filesystem_error
例外を送出する - (3) : 投げない
例
Linux環境の例
#include <cassert>
#include <filesystem>
#include <cstring>
#include <sys/socket.h>
#include <sys/un.h>
namespace fs = std::filesystem;
int main()
{
// プロセス間通信用に、ポート番号の代わりにファイル名でソケットを区別する。
// (UNIXドメインソケット)
sockaddr_un addr;
addr.sun_family = AF_UNIX;
std::strcpy(addr.sun_path, "sock");
int fd = socket(PF_UNIX, SOCK_STREAM, 0);
bind(fd, (sockaddr*)&addr, sizeof(addr));
// (1)
// 取得済みのファイル状態を使用して、ソケットかを確認
assert(fs::is_socket(fs::status("sock")));
// (2)
// パスを指定して、ソケットかを確認。
assert(fs::is_socket("sock"));
// (3)
// エラー情報を例外ではなくerror_codeで受け取る
std::error_code ec;
bool result = fs::is_socket("sock", ec);
assert(!ec);
assert(result);
}
出力
バージョン
言語
- C++17
処理系
- Clang: 7.0 ✅
- GCC: 8.1 ✅
- Visual C++: