C 언어 콜백 함수 구현

CBeginner
지금 연습하기

소개

이 프로젝트에서는 C 언어에서 콜백 함수를 구현하는 방법을 배우게 됩니다. 콜백 함수는 C 프로그래밍에서 강력한 기술이며, 특히 Linux 시스템 개발과 같이 콜백 함수가 일반적으로 사용되는 상황에서 유용합니다.

👀 미리보기

$ gcc test_callback.c callback.c -o test_callback
$ ./test_callback
Alarm1:0
Alarm2:1
Alarm3:2

🎯 과제

이 프로젝트에서는 다음을 배우게 됩니다:

  • C 에서 콜백 함수를 정의하고 사용하는 방법
  • 콜백 함수를 사용하여 알람을 등록하고 트리거하는 방법
  • 콜백 함수 구현에서 예외 상황 및 오류를 처리하는 방법

🏆 성과

이 프로젝트를 완료하면 다음을 수행할 수 있습니다:

  • C 프로그래밍에서 콜백 함수의 개념과 사용법을 이해할 수 있습니다.
  • 알람 등록 및 트리거를 포함하는 콜백 기반 알람 시스템을 구현할 수 있습니다.
  • 콜백 함수에서 발생할 수 있는 잠재적인 문제를 처리하기 위해 견고하고 방어적인 코드를 작성할 수 있습니다.
  • 이벤트 기반 시스템 또는 비동기 작업과 같은 C 프로그래밍의 다른 영역에 콜백 함수에 대한 지식을 적용할 수 있습니다.

콜백 함수 이해

이 단계에서는 C 언어에서 콜백 함수의 개념과 Linux C 프로그램 개발에서 콜백 함수가 어떻게 사용되는지 배우게 됩니다.

콜백 함수는 함수를 다른 함수의 인수로 전달하는 방법이며, 다른 함수는 나중에 전달된 함수를 호출할 수 있습니다. 이는 더 유연하고 모듈화된 코드를 가능하게 하는 강력한 기술입니다.

callback.c 파일에 제공된 코드에서 콜백 함수는 알람 시스템을 구현하는 데 사용됩니다. alarm 구조체는 알람을 나타내고, register_alarm 함수는 알람을 등록하는 데 사용됩니다. 그런 다음 hit_alarm 함수는 등록된 알람을 트리거하는 데 사용됩니다.

✨ 솔루션 확인 및 연습

결함 식별 및 수정

이제 callback.c 파일에 제공된 코드를 살펴보고 결함을 수정해 보겠습니다.

  1. 세그멘테이션 오류 (Segmentation Fault): 이는 alarm_list가 올바르게 채워지거나 액세스되지 않아 불법적인 메모리 접근이 발생하기 때문일 가능성이 큽니다.
  2. register_alarm에서 부적절한 인덱스 처리: index 변수는 register_alarm에 로컬이며 함수가 호출될 때마다 0 으로 다시 초기화됩니다. 이로 인해 모든 알람이 인덱스 1 에 등록되어 서로 덮어쓰게 됩니다.

다음과 같이 callback.c 파일을 업데이트하십시오:

#include "callback.h"

alarm alarm_list[MAX_ALARMS];
int current_index = 0; // Global index tracker

void register_alarm(alarm a) {
    if (current_index < MAX_ALARMS) {
        alarm_list[current_index] = a;
        current_index++;
    }
    // If the number of registered alarms exceeds MAX_ALARMS, do nothing (don't report an error)
}

int hit_alarm(int index) {
    if (index < 0 || index >= MAX_ALARMS || !alarm_list[index])
        return 1;
    (*alarm_list[index])(index);
    return 0;
}

주요 변경 사항은 다음과 같습니다:

  1. 알람 등록을 위한 현재 인덱스를 추적하기 위해 전역 변수 current_index를 추가했습니다.
  2. register_alarm에서 알람을 등록하기 전에 current_indexMAX_ALARMS보다 작은지 확인합니다. 등록된 알람 수가 MAX_ALARMS를 초과하면 오류를 보고하지 않고 단순히 계속 진행합니다.
  3. hit_alarm에서 인덱스가 유효한 범위 내에 있는지, 해당 인덱스에 실제로 알람이 등록되었는지 확인하기 위해 추가 검사를 추가했습니다. 그렇지 않은 경우, 알람이 트리거되지 않았음을 나타내기 위해 1 을 반환합니다.
✨ 솔루션 확인 및 연습

콜백 함수 테스트

이제 callback.c 파일의 결함을 수정했으므로, 제공된 test_callback.c 프로그램을 실행하여 콜백 함수를 테스트해 보겠습니다.

프로그램을 컴파일합니다:

gcc test_callback.c callback.c -o test_callback

프로그램을 실행합니다:

./test_callback

출력:

Alarm1:0
Alarm2:1
Alarm3:2

이제 출력은 예상 출력과 일치해야 하며, 프로그램은 세그멘테이션 오류나 다른 오류 없이 실행되어야 합니다.

축하합니다! 콜백 함수 구현을 성공적으로 디버깅하고 수정했습니다.

✨ 솔루션 확인 및 연습

요약

축하합니다! 이 프로젝트를 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 기술을 향상시킬 수 있습니다.