Zeiger vs. Handles in C (werden die Begriffe verwendet, um verschiedene Dinge zu vermitteln?)

Lesezeit: 5 Minuten

Kürzlich habe ich ein Whitepaper von einer Person gelesen, die einen Zeiger auf eine Struktur als Handle bezeichnet. Der Autor war eindeutig jemand, der zuvor C-Code auf der Windows-Plattform geschrieben hatte. Googeln deutet darauf hin, dass Windows-Programmierer über Handles mit Systemkomponenten interagieren. Ich frage mich, ob es für Windows-Programmierer üblich ist, alle Strukturzeiger als Handles zu bezeichnen? Oder soll der Begriff Handle etwas über den Zeiger hinaus auf die Struktur übertragen? Ich frage als Linux-C-Programmierer.

Das Whitepaper, auf das ich mich beziehe, lautet: Duff, Heroux und Pozo. Ein Überblick über die Sparse Basic Linear Algebra-Unterprogramme: Der neue Standard vom BLAS Technical Forum. ACM Transactions on Mathematical Software, Bd. 28, Nr. 2, Juni 2002, Seiten 239-267.

Der Begriff Handle bedeutet im Allgemeinen einen undurchsichtigen Wert, der nur für die API von Bedeutung ist, die ihn erzeugt hat. In Win32 ist der Typ HANDLE entweder ein Zeiger im Kernelspeicher (auf den Anwendungen sowieso nicht zugreifen können) oder ein Index in ein Kernel-internes Array.

  • Gute Antwort. Für uns alle Posix-Leute ist ein Dateideskriptor ein gutes Beispiel für ein Handle.

    – R. Samuel Klatschko

    17. Dezember 2009 um 19:24 Uhr

  • Tatsächlich ist der HANDLE-Typ unter NT ein Wert, der in der Handle-Tabelle pro Prozess enthalten ist, die den Handle-Wert in einen Zeiger im Kernelspeicher abbildet, es ist kein tatsächlicher Zeigerwert.

    – Larry Ostermann

    17. Dezember 2009 um 21:00 Uhr

  • In Win32 ist der Typ HANDLE erklärt als Leere *

    – david

    13. August 2013 um 3:56 Uhr

  • Was für eine tolle Definition. Das zu lesen machte einfach alles andere so viel Sinn.

    – Jake Kiesel

    27. April 2016 um 20:48 Uhr

Benutzer-Avatar
Mordachai

Ein Griff ist ein altes und verehrtes Konzept.

Ein Keks ist so ziemlich das Gleiche. Oder eine GUID. Oder ein Ticket, um Ihr Auto von einem Parkplatz abzuholen, oder Ihren Mantel von einem schicken Restaurant usw.

Es ist jeder einzigartige Wert, der, wenn er dem Emittenten präsentiert wird, verwendet werden kann, um auf die eigentliche Sache zurückzuverfolgen, auf die verwiesen wird, durch einen beliebigen undurchsichtigen Mechanismus, den der Emittent wünscht. Sie wissen möglicherweise nichts über diesen Prozess oder wissen genau (nur konzeptionell), was die zugrunde liegende Sache ist.

Es wurde stark von Windows verwendet, ist aber sicherlich nicht nur Windows vorbehalten.

Normalerweise würden Sie „Handle“ nicht für „Zeiger auf Struktur“ verwenden. Handle ist eher wie “Token” als wie “Zeiger”. Es bezieht sich auf etwas – Datei, Systemressource, Speicher, Status-Snapshot usw. Aber was-genau-es-ist basiert auf dem Kontext des Handles selbst (dh wer das Handle ausgegeben hat).

Handles wurden auch stark in der frühen Dateisystemprogrammierung in K&R C verwendet.

  • Die Verwendung der Vergangenheitsform ist hier bemerkenswert, was, wenn überhaupt, hat Ihrer Meinung nach den einst allgegenwärtigen Griff ersetzt? Ich bin wirklich neugierig!

    – Aqtau

    14. April 2013 um 23:06 Uhr

  • Das Hauptproblem bei Handles besteht darin, dass sie in der Regel nicht über ausreichende Typinformationen verfügen. dh sie sind normalerweise ein int oder etwas ähnliches (unsigned), was sehr leicht zu missbrauchen ist. Und die Leute machen oft die (zweifelhafte) Annahme, dass Null ein magischer Not-a-Handle-Wert ist, als wäre es ein C-konformer Zeiger. Rein nach meiner Erfahrung als C++-Programmierer auf der Windows-Plattform sehe ich also nur sehr wenige neue APIs (falls vorhanden), die Handles verwenden. Stattdessen sehe ich viele Objekte. Das Konzept eines Handles ist immer noch gültig: Sie müssen nur etwas verwenden, um es darzustellen, das typeindeutig ist, um Missbrauch zu vermeiden.

    – Mordachai

    15. April 2013 um 14:06 Uhr

  • @Mordachai Was meinst du mit “Ein Griff ist ein alt und verehrt Konzept.” Meinst du nützlich und lange verwendet?

    – John

    20. März um 6:25 Uhr

Benutzer-Avatar
Markus Byers

Ich verwende das Wort Handle, um einen Zeiger zu bezeichnen, der auf ein “Objekt” zeigt, das eine Ressource darstellt – oft eine Betriebssystemressource, während ein Zeiger nur auf einen Speicher zeigt. Wenn Sie ein Handle für etwas haben, sollten Sie nicht versuchen, Bytes direkt darin zu lesen und zu schreiben, sondern es durch bereitgestellte Methoden manipulieren.

Oft werden Griffe als undurchsichtig ausgeführt void *was eine weitere Ermutigung ist, nicht zu versuchen, es direkt zu dereferenzieren.

  • +1-Griffe werden aus diesem Grund manchmal als “undurchsichtige” Griffe bezeichnet.

    – Graem Perrow

    17. Dezember 2009 um 18:22 Uhr

  • Hoppla – ich wollte sagen “Griffe werden aus diesem Grund manchmal als “undurchsichtig” bezeichnet”

    – Graem Perrow

    17. Dezember 2009 um 18:30 Uhr

Benutzer-Avatar
Greg Hewgill

Da Sie sich auf Handles beziehen, die als Zeiger auf eine Struktur verwendet werden, wie sie von einem Windows-Programmierer verwendet werden, werde ich in diesem Kontext antworten. Bitte beachten Sie, dass es eindeutig viele verschiedene Arten von “Handles” gibt, da es sich um ein generisches Konzept handelt, das in der Computerumgebung weit verbreitet ist. Sicherlich sind Sie mit dem Konzept eines Dateihandles vertraut; Windows bietet auch Fensterhandles und viele andere Arten von Handles an. Das gesagt:

Ein “Memory Handle” (das einem Zeiger auf eine Struktur ähnelt) ist ein Konzept aus dem Land der 16-Bit-Windows-Programmierung, wo es keinen Speichermanager in der CPU gab und die gesamte Speicherverwaltung in Software erfolgen musste. Im Wesentlichen war ein “Handle” eine Art Zeiger, aber das Betriebssystem konnte sich frei im Speicher bewegen, auf den sich das Handle bezog. Sie können das nicht mit einem normalen Zeiger machen, aber das Handle hatte Funktionen, die die erhalten und freigeben würden tatsächlich Speicheradresse.

Mit der Einführung von Win32, wo die CPU über einen Hardware-Speichermanager verfügte, wurde das Konzept des Speicherhandles obsolet. Andere Arten von Handles wie Dateihandles und Fensterhandles sind weiterhin in Win32 vorhanden, sind jedoch keine Zeiger auf Strukturen.

Der Begriff Handle wird verwendet, um jede Technik zu bezeichnen, die Ihnen den Zugriff auf ein anderes Objekt ermöglicht. Ein Handle kann ein Zeiger, eine Referenz, ein Zeiger auf einen Zeiger usw. sein. Aber sicher bezieht es sich auf Klassen, Objekte usw. Handle muss also nicht immer ein Zeiger auf eine Struktur sein.

-ANZEIGE.

Benutzer-Avatar
David Thornley

In den alten Tagen der MacOS-Programmierung, noch vor OSX, war ein Handle ein Zeiger auf einen Zeiger. Dadurch konnte das Betriebssystem Dinge verschieben, ohne die Zeiger des Benutzers ungültig zu machen. Es gab Regeln, wann wir davon ausgehen konnten, dass sich das Objekt, auf das gezeigt wurde, nicht bewegen würde, an das ich mich nicht erinnere.

Benutzer-Avatar
Nick Dixon

Der Begriff „Handle“ stammt nicht von Windows, obwohl er unter Windows-Programmierern weit verbreitet war.

In der C-Standardbibliothek (stdio.h) sind Dateihandles Zeiger auf eine Datenstruktur, die von der C-Bibliothek verwendet wird.

Die reine Unix-Programmierung verwendet Dateideskriptoren, die Indizes in einer Kernel-Datenstruktur sind, aber Zeiger werden in Unix seit über 30 Jahren als Handles verwendet.

1355060cookie-checkZeiger vs. Handles in C (werden die Begriffe verwendet, um verschiedene Dinge zu vermitteln?)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy