Einführung
In diesem Projekt lernst du, wie du eine Callback-Funktion in der C-Sprache implementierst. Callback-Funktionen sind eine leistungsstarke Technik in der C-Programmierung, insbesondere im Kontext der Linux-Systementwicklung, wo sie häufig verwendet werden.
👀 Vorschau
$ gcc test_callback.c callback.c -o test_callback
$./test_callback
Alarm1:0
Alarm2:1
Alarm3:2
🎯 Aufgaben
In diesem Projekt wirst du lernen:
- Wie du Callback-Funktionen in C definierst und verwendest
- Wie du Alarme mit einer Callback-Funktion registrierst und auslöst
- Wie du Randfälle und Fehler bei der Implementierung der Callback-Funktion behandelst
🏆 Errungenschaften
Nach Abschluss dieses Projekts wirst du in der Lage sein:
- Den Begriff von Callback-Funktionen und deren Verwendung in der C-Programmierung zu verstehen
- Ein Callback-basiertes Alarmsystem zu implementieren, einschließlich der Registrierung und Auslösung von Alarmen
- Robustes und defensives Code zu schreiben, um potenzielle Probleme in der Callback-Funktion zu behandeln
- Dein Wissen um Callback-Funktionen auf andere Gebiete der C-Programmierung anzuwenden, wie z. B. Ereignis-getriebene Systeme oder asynchrone Operationen
Verstehen der Callback-Funktion
In diesem Schritt lernst du den Begriff der Callback-Funktionen in der C-Sprache und wie sie in der Linux-C-Programmierung verwendet werden.
Callback-Funktionen sind eine Möglichkeit, eine Funktion als Argument an eine andere Funktion zu übergeben, die dann die übergebene Funktion zu einem späteren Zeitpunkt aufrufen kann. Dies ist eine leistungsstarke Technik, die für eine flexiblere und modularere Code ermöglicht.
In dem in der Datei callback.c bereitgestellten Code wird die Callback-Funktion verwendet, um ein Alarmsystem zu implementieren. Die alarm-Struktur repräsentiert einen Alarm, und die register_alarm-Funktion wird verwendet, um einen Alarm zu registrieren. Die hit_alarm-Funktion wird dann verwendet, um die registrierten Alarme auszulösen.
Identifizieren und beheben die Defekte
Lassen Sie uns nun den in der Datei callback.c bereitgestellten Code betrachten und die Fehler beheben.
- Segmentation Fault: Dies liegt wahrscheinlich daran, dass die
alarm_listnicht richtig befüllt oder zugegriffen wird, was zu einem illegalen Arbeitsspeicherzugriff führt. - Fehlerhafte Indexverwaltung in
register_alarm: Die Variableindexist lokal inregister_alarmund wird jedes Mal, wenn die Funktion aufgerufen wird, erneut auf 0 initialisiert. Dadurch werden alle Alarme am Index 1 registriert und überschreiben sich gegenseitig.
Aktualisieren Sie die Datei callback.c wie folgt:
#include "callback.h"
alarm alarm_list[MAX_ALARMS];
int current_index = 0; // Globaler Index-Tracker
void register_alarm(alarm a) {
if (current_index < MAX_ALARMS) {
alarm_list[current_index] = a;
current_index++;
}
// Wenn die Anzahl der registrierten Alarme MAX_ALARMS überschreitet, tun Sie nichts (berichten Sie keinen Fehler)
}
int hit_alarm(int index) {
if (index < 0 || index >= MAX_ALARMS ||!alarm_list[index])
return 1;
(*alarm_list[index])(index);
return 0;
}
Die wichtigsten Änderungen sind:
- Ein globaler
current_index-Variablen hinzugefügt, um den aktuellen Index für die Alarmregistrierung zu verfolgen. - In
register_alarmüberprüfen wir, obcurrent_indexkleiner alsMAX_ALARMSist, bevor wir den Alarm registrieren. Wenn die Anzahl der registrierten AlarmeMAX_ALARMSüberschreitet, berichten wir keinen Fehler und setzen einfach fort. - In
hit_alarmhaben wir zusätzliche Überprüfungen hinzugefügt, um sicherzustellen, dass der Index im gültigen Bereich liegt und dass an diesem Index tatsächlich ein Alarm registriert ist. Wenn nicht, geben wir 1 zurück, um anzuzeigen, dass kein Alarm ausgelöst wurde.
Testen Sie die Callback-Funktion
Jetzt, nachdem wir die Fehler in der Datei callback.c behoben haben, testen wir die Callback-Funktion, indem wir das bereitgestellte Programm test_callback.c ausführen.
Kompilieren Sie das Programm:
gcc test_callback.c callback.c -o test_callback
Führen Sie das Programm aus:
./test_callback
Ausgabe:
Alarm1:0
Alarm2:1
Alarm3:2
Die Ausgabe sollte jetzt mit der erwarteten Ausgabe übereinstimmen, und das Programm sollte ohne jegliche Segmentation Faults oder andere Fehler ausgeführt werden können.
Herzlichen Glückwunsch! Sie haben die Implementierung der Callback-Funktion erfolgreich debuggt und behoben.
Zusammenfassung
Herzlichen Glückwunsch! Sie haben dieses Projekt abgeschlossen. Sie können in LabEx weitere Übungen absolvieren, um Ihre Fähigkeiten zu verbessern.



