Namensräume
Varianten
Aktionen

std::experimental::filesystem::is_socket

Von cppreference.com
< cpp‎ | experimental‎ | fs
 
 
 
 
Definiert im Header <experimental/filesystem>
bool is_socket( file_status s );
(1) (Dateisystem-TS)
bool is_socket( const path& p );
bool is_socket( const path& p, error_code& ec );
(2) (Dateisystem-TS)

Prüft, ob der gegebene Dateistatus oder Pfad einem benannten IPC-Socket entspricht, wie durch die POSIX S_IFSOCK ermittelt wird.

1) Entspricht s.type() == file_type::socket.
2) Entspricht is_socket(status(p)) oder is_socket(status(p, ec)).

Inhalt

[edit] Parameter

s - Dateistatus zum Prüfen
p - Zu untersuchender Pfad
ec - Ausgabeparameter für die Fehlerberichterstattung in der nicht auslösenden Überladung

[edit] Rückgabewert

true, wenn die durch p angezeigte Datei oder der durch s angezeigte Typ auf einen benannten Socket verweist. Die nicht-auslösende Überladung gibt false zurück, wenn ein Fehler auftritt.

[edit] Ausnahmen

1)
noexcept-Spezifikation:  
noexcept
  
2) Die Überladung, die keinen Parameter vom Typ error_code& annimmt, löst filesystem_error bei zugrundeliegenden Betriebssystem-API-Fehlern aus, konstruiert mit p als erstem Argument und dem Betriebssystem-Fehlercode als Fehlercode-Argument. std::bad_alloc kann ausgelöst werden, wenn die Speicherzuweisung fehlschlägt. Die Überladung, die einen Parameter vom Typ error_code& annimmt, setzt diesen auf den Betriebssystem-API-Fehlercode, wenn ein Betriebssystem-API-Aufruf fehlschlägt, und führt ec.clear() aus, wenn keine Fehler auftreten. Diese Überladung hat
noexcept-Spezifikation:  
noexcept
  

[edit] Hinweise

Benannte Sockets sind UNIX-Domain-Sockets, die mit den POSIX-APIs socket und bind erstellt werden und für fortgeschrittene Interprozesskommunikation verwendet werden können. Insbesondere können sie verwendet werden, um offene Dateideskriptoren von einem laufenden Prozess zu einem anderen zu transportieren.

Die von dieser Funktion bereitgestellten Informationen werden normalerweise auch als Nebenprodukt der Verzeichnisiteration bereitgestellt. Während der Verzeichnisiteration ist der Aufruf von is_socket(*iterator) weniger effizient als is_socket(iterator->status()).

[edit] Beispiel

#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");
}

Mögliche Ausgabe

"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

[edit] Siehe auch

ermittelt Dateiattribute
ermittelt Dateiattribute, wobei das Ziel des symbolischen Links geprüft wird
(Funktion) [bearbeiten]
repräsentiert Dateityp und Berechtigungen
(Klasse) [bearbeiten]
prüft, ob der Dateistatus bekannt ist
(Funktion) [bearbeiten]
prüft, ob der gegebene Pfad auf ein Blockgerät verweist
(Funktion) [bearbeiten]
prüft, ob der gegebene Pfad auf ein Zeichengerät verweist
(Funktion) [bearbeiten]
prüft, ob der gegebene Pfad auf ein Verzeichnis verweist
(Funktion) [bearbeiten]
prüft, ob der gegebene Pfad auf eine benannte Pipe verweist
(Funktion) [bearbeiten]
prüft, ob das Argument auf eine andere Datei verweist
(Funktion) [bearbeiten]
prüft, ob das Argument auf eine reguläre Datei verweist
(Funktion) [bearbeiten]
prüft, ob das Argument auf einen symbolischen Link verweist
(Funktion) [bearbeiten]
prüft, ob ein Pfad auf ein existierendes Dateisystemobjekt verweist
(Funktion) [bearbeiten]
gecacheter Status der von diesem Verzeichniseintrag bezeichneten Datei
gecacheter symlink_status der von diesem Verzeichniseintrag bezeichneten Datei
(öffentliche Memberfunktion von std::experimental::filesystem::directory_entry) [edit]