Cosa si intende con il termine "hook" nella programmazione?


248

Di recente ho sentito il termine "hook" mentre parlavo con alcune persone di un programma che stavo scrivendo. Non sono sicuro di cosa implichi esattamente questo termine, anche se ho dedotto dalla conversazione che un hook è un tipo di funzione. Ho cercato una definizione ma non sono riuscito a trovare una buona risposta. Qualcuno potrebbe darmi un'idea di cosa significhi generalmente questo termine e forse un piccolo esempio per illustrare la definizione?


3
Vedi Hooking @ Wikipedia . Il link è sepolto in una delle risposte meno votate.
Palec,

Risposte:


143

Essenzialmente è un posto nel codice che ti consente di attingere a un modulo per fornire un comportamento diverso o per reagire quando succede qualcosa.


7
È simile a una richiamata?
Chris,

19
Gli hook spesso (ma non sempre) usano le funzioni di callback. Ad esempio, è possibile agganciare un sistema di eventi utilizzando "hookEvent (Events.STARTUP, myCallbackFunction)". Stai passando un puntatore a funzione alla funzione hookEvent, quindi sa quale funzione chiamare quando si verifica l'evento. Spero che aiuti :-)
William Brendel il

6
Esattamente. Un callback è un "tipo" di hook.
Michea il

21
um ... no. Un callback è un callback e non ha nulla a che fare con gli hook, i callback sono semplicemente USATI per l'implementazione dei metodi hook. I callback sono puntatori (RELJMP) a funzioni / metodi / procedure (CALL), gli hook sono modifiche alle applicazioni in esecuzione.
specializt

1
@SahilBabbar No. Un interrupt provoca l'esecuzione delle istruzioni in un determinato punto (l'interrupt). Tuttavia, potresti essere in grado di collegarti al processo di gestione degli interrupt, ad esempio modificando la tabella che elenca le posizioni dei gestori degli interrupt in modo che il tuo codice venga chiamato per primo sull'interrupt (e quindi il tuo codice chiamerebbe il codice di gestione degli interrupt precedentemente presente, in un modo a catena)
David Tonhofer il

77

Un hook è la funzionalità fornita dal software per gli utenti di quel software per avere il proprio codice chiamato in determinate circostanze. Tale codice può aumentare o sostituire il codice corrente.

Ai vecchi tempi in cui i computer erano veramente personali e i virus erano meno diffusi (sto parlando degli anni '80), era semplice come correggere il software del sistema operativo stesso per chiamare il tuo codice. Ricordo di aver scritto un'estensione del linguaggio BASIC di Applesoft su Apple II che ha semplicemente agganciato il mio codice all'interprete BASIC iniettando una chiamata al mio codice prima che una qualsiasi delle linee fosse elaborata.

Alcuni computer avevano hook pre-progettati, ad esempio lo stream I / O su Apple II. Ha usato un tale gancio per iniettare l'intero sottosistema del disco (le ROM Apple II erano originariamente costruite nei giorni in cui le cassette erano il supporto di archiviazione principale per i PC). Hai controllato i dischi stampando il codice ASCII 4 ( CTRL-D) seguito dal comando che volevi eseguire quindi a CR, ed è stato intercettato dal sottosistema del disco, che si era agganciato alle routine di stampa della ROM Apple.

Quindi, ad esempio, le linee:

PRINT CHR(4);"CATALOG"
PRINT CHR(4);"IN#6"

elenca il contenuto del disco e quindi reinizializza la macchina. Ciò ha consentito trucchi come la protezione dei programmi BASIC impostando la prima riga come:

123 REM XIN#6

quindi usando POKEper inserire il CTRL-Dcarattere in cui si Xtrovava. Quindi, chiunque tenti di elencare la propria sorgente invierebbe la sequenza di reinizializzazione attraverso le routine di output in cui il sottosistema del disco lo rileverebbe.

Questo è spesso il tipo di inganno a cui dovevamo ricorrere per ottenere il comportamento che volevamo.

Al giorno d'oggi, con il sistema operativo più sicuro, fornisce funzionalità per gli hook, poiché non è più necessario modificare il sistema operativo "in volo" o sul disco.

Sono in giro da molto tempo. I mainframe li avevano (chiamati uscite) e molti software mainframe usano queste strutture anche adesso. Ad esempio, il sistema di controllo del codice sorgente gratuito fornito con z / OS (chiamato SCLM) consente di sostituire completamente il sottosistema di sicurezza semplicemente posizionando il proprio codice nell'uscita.


41

In senso generico, un "hook" è qualcosa che consente a un programmatore di visualizzare e / o interagire con e / o modificare qualcosa che sta già accadendo in un sistema / programma.

Ad esempio, Drupal CMS fornisce agli sviluppatori hook che consentono loro di intraprendere ulteriori azioni dopo la creazione di un "nodo del contenuto". Se uno sviluppatore non implementa un hook, il nodo viene creato normalmente. Se uno sviluppatore implementa un hook, può avere del codice aggiuntivo eseguito ogni volta che viene creato un nodo. Questo codice potrebbe fare qualsiasi cosa, incluso il rollback e / o l'alterazione dell'azione originale. Potrebbe anche fare qualcosa di completamente estraneo alla creazione del nodo.

Un callback potrebbe essere pensato come un tipo specifico di hook. Implementando la funzionalità di callback in un sistema, quel sistema ti consente di chiamare del codice aggiuntivo dopo che un'azione è stata completata. Tuttavia, l'aggancio (come termine generico) non si limita ai callback.

Un altro esempio. A volte gli sviluppatori Web faranno riferimento a nomi di classe e / o ID su elementi come hook. Questo perché posizionando il nome ID / classe su un elemento, possono quindi usare Javascript per modificare quell'elemento o "agganciarsi" al documento della pagina. (questo sta allungando il significato, ma è comunemente usato e vale la pena menzionare)


Cosa intendi con "aggancio al documento di paging"? Potresti fare un esempio? Ho capito il primo esempio: dare a un elemento html un id in modo da poter usare javacript per modificare l'elemento.
committedandroider

21

Semplice ha detto:

Un hook è un mezzo per eseguire codice personalizzato (funzione) prima, dopo o al posto del codice esistente. Ad esempio, una funzione può essere scritta per "agganciarsi" al processo di accesso al fine di eseguire una funzione Captcha prima di continuare con il normale processo di accesso.


Migliore risposta imo
Daniel,

15

L'aggancio nella programmazione è una tecnica che impiega i cosiddetti hook per creare una catena di procedure come gestore di eventi.


15

Gli hook sono una categoria di funzioni che consente al codice di base di chiamare il codice di estensione. Ciò può essere utile nelle situazioni in cui uno sviluppatore principale desidera offrire estensibilità senza esporre il proprio codice.

Un utilizzo di hook è nello sviluppo di mod per videogiochi. Un gioco potrebbe non consentire agli sviluppatori di mod di estendere le funzionalità di base, ma gli sviluppatori di librerie di mod core possono aggiungere hook. Con questi hook, gli sviluppatori indipendenti possono avere il loro codice personalizzato su qualsiasi evento desiderato, come caricamento del gioco, aggiornamenti dell'inventario, interazioni tra entità, ecc.

Un metodo di implementazione comune consiste nel fornire a una funzione un elenco vuoto di callback, quindi esporre la possibilità di estendere l'elenco di callback. Il codice di base chiamerà sempre la funzione nello stesso momento e nel momento giusto ma, con un elenco di richiamata vuoto, la funzione non fa nulla. Questo è di progettazione.

Una terza parte, quindi, ha la possibilità di scrivere codice aggiuntivo e aggiungere il loro nuovo callback all'elenco callback dell'hook. Con nient'altro che un riferimento ai ganci disponibili, hanno funzionalità estese a rischio minimo per il sistema di base.

Gli hook non consentono agli sviluppatori di fare nulla che non possa essere fatto con altre strutture e interfacce. Sono una scelta da prendere in considerazione per l'attività e gli utenti (sviluppatori di terze parti).

Per chiarimenti: un hook consente l'estensione e può essere implementato utilizzando i callback. I callback generalmente non sono altro che un puntatore a funzione; l'indirizzo calcolato di una funzione. Sembra esserci confusione in altre risposte / commenti.


4

Hook indica una posizione nel codice in cui si invia un evento di un determinato tipo e se questo evento è stato registrato in precedenza con una funzione appropriata da richiamare, verrà gestito da questa funzione registrata, altrimenti non accade nulla.


2

gli hook possono essere eseguiti quando si verificano alcune condizioni. ad esempio alcune modifiche alle variabili o alcune azioni vengono chiamate o si verifica un evento. i ganci possono entrare nel processo e cambiare le cose o reagire ai cambiamenti.


1

Spesso l'aggancio si riferisce all'aggancio del messaggio Win32 o agli equivalenti Linux / OSX, ma l'aggancio più generico sta semplicemente notificando un altro oggetto / finestra / programma / ecc. Che si desidera ricevere una notifica quando si verifica un'azione specifica. Ad esempio: tutte le finestre del sistema ti avvisano mentre stanno per chiudere.

Come regola generale, l'aggancio è alquanto pericoloso poiché farlo senza capire in che modo influisce sul sistema può portare all'instabilità o ad un comportamento inaspettato. Può anche essere MOLTO utile in determinate circostanze, ha pensato. Ad esempio: FRAPS lo usa per determinare su quali finestre dovrebbe mostrare il suo contatore FPS.


1

Una catena di ganci è un insieme di funzioni in cui ciascuna funzione chiama la successiva. Ciò che è significativo in una catena di hook è che un programmatore può aggiungere un'altra funzione alla catena in fase di esecuzione. Un modo per farlo è cercare una posizione nota in cui è conservato l'indirizzo della prima funzione in una catena. Quindi si salva il valore di quel puntatore a funzione e si sovrascrive il valore all'indirizzo iniziale con l'indirizzo della funzione che si desidera inserire nella catena hook. La funzione viene quindi chiamata, svolge la propria attività e chiama la funzione successiva nella catena (a meno che non si decida diversamente). Naturalmente, ci sono molti altri modi per creare una catena di hook, dalla scrittura diretta alla memoria all'utilizzo delle strutture di metaprogrammazione di linguaggi come Ruby o Python.

Un esempio di una catena di hook è il modo in cui un'applicazione MS Windows elabora i messaggi. Ogni funzione nella catena di elaborazione elabora un messaggio o lo invia alla funzione successiva nella catena.


1

Nel sistema di gestione dei contenuti di Drupal, "hook" ha un significato relativamente specifico. Quando si verifica un evento interno (come la creazione di contenuto o il login dell'utente, ad esempio), i moduli possono rispondere all'evento implementando una speciale funzione "hook". Ciò avviene tramite la convenzione di denominazione, ad esempio [nome-plugin-dell'utente] _user_login () per l'evento Accesso utente.

A causa di questa convenzione, gli eventi sottostanti vengono definiti "hook" e compaiono con nomi come "hook_user_login" e "hook_user_authenticate ()" nella documentazione dell'API di Drupal.


Questo segue l'idea sopra menzionata , di un "callback" "per reagire quando succede qualcosa". In questo caso, il callback non è esplicitamente registrato, ma basato su "nomi magici". Questo è attualmente discusso su drupal.org, vedi Usa Symfony EventDispatcher per gli hook di eventi
donquixote

Per generalizzare, un hook / callback / listener può essere "reso noto al codice chiamante" in diversi modi (senza dire che questo è completo): 1. funzioni con nome magico 2. classi con nome magico 3. funzioni esplicitamente registrate 4. esplicitamente oggetti registrati (ascoltatori, abbonati, osservatori) 5. nomi di classi esplicitamente registrati (+ argomenti del costruttore opzionali), da istanziare prima che il hook si attivi. 6. modificando il codice chiamante
donquixote

1

In breve, è possibile modificare il codice di una chiamata API in modo MessageBoxche esegua una diversa funzione modificata dall'utente (a livello globale funzionerà a livello di sistema, a livello locale funzionerà a livello di processo).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.