Die Ursprünge und Designmerkmale sind unterschiedlich. Im Allgemeinen ist es besser, ein Protokoll von Grund auf neu zu entwerfen, da Sie es dann speziell für Ihre Anforderungen anpassen können, ohne Probleme mit älteren Protokollen zu haben.
Ich glaube, dass diese Wahl darauf zurückzuführen ist, dass die kerninterne Implementierung von UNIX-Domänensockets zu unterschiedlich ist, um eine vernünftige Portierung auf die Benutzer-Kernel-Kommunikation zu ermöglichen. Die Liste der Protokolle für AF_NETLINK wurde speziell für die ioctl-ähnliche Steuerung entwickelt. AF_UNIX verwendet nicht einmal das Argument "protocol" für die socket
Funktion. Und wenn sie die Definition irgendwie erweitern würden, um zusätzliche Protokolle zuzulassen, würde dies wahrscheinlich vorhandene Anwendungen beschädigen, und es wäre im Kernel sehr umständlich, die neuen Protokolle in den Kernel-Steuercode umzuleiten. Es kann auch ein Sicherheitsrisiko sein, diese beiden Funktionen zu überlappen (insbesondere da AF_UNIX ursprünglich nicht für diesen Zweck entwickelt wurde).
Und schließlich ... UNIX-Domain-Sockets verwenden das Dateisystem als Namespace (obwohl es einen Hack gibt, der "anonyme" Sockets zulässt). Als solche stehen sie sofort allen Benutzern zur Verfügung, die über Berechtigungen für diesen Socket verfügen. Um mit dem Kernel zu kommunizieren, muss irgendwo im Dateisystem (wahrscheinlich sys?) Eine immer geöffnete "Datei" vorhanden sein, die Benutzer verwenden würden Stellen Sie eine Verbindung zum Kernel her.
Kurz gesagt, sie sollen einfach für verschiedene Dinge verwendet werden. Selbst wenn Sie AF_NETLINK für zwei Userspace-Prozesse wiederverwenden können (dies geschieht anders als in AF_UNIX), würde das Gegenteil nicht wirklich funktionieren.
convey the information about the PID of the calling process
-> SO_PEERCRED, SCM_CREDENTIALS?