inflearn logo
강의

講義

知識共有

高度なC言語

関数ポインター活用 II

signal함수와 관련하여 질문있습니다.

26

ccccssung

投稿した質問数 6

0

강사님, signal함수오 관련하여 질문있습니다.
함수포인터 활용 II 강의에서
26분쯤에
다음과 같은 코드를 작성하셨습니다.
#include <stdio.h>
#define SIGINT 2
void signal(int, void (*)(int));

void my_sig(int signo){
printf("my_sig(%d)\n",signo);
}

int main(){
signal(SIGINT,my_sig);
while(1);
return 0;
}
애초에 signal함수 자체가 return type이 함수 퐁니터인데 지금 void포인터를 이렇게 선언하게 된다면 해당 파일은 컴파일되지만, 링킹과정에서 문제될 것 같은데 왜 정상적으로 실행되는지 이해가 되지 않습니다.
답변 부탁드리겠습니다!
감사합니다.

c 컴퓨터-구조 임베디드 device-driver

回答 1

0

jikim1770

안녕하세요! 컴파일과 링킹의 동작 원리를 정확히 짚어낸 아주 훌륭한 질문입니다.

결론부터 말씀드리면, C언어 링커(Linker)는 함수를 연결할 때 오직 '함수 이름'만 확인할 뿐,

반환 타입이나 매개변수 정보는 전혀 검사하지 않기 때문입니다.

심볼 테이블에는 '함수 이름'만 기록됩니다.

C언어는 컴파일을 마친 목적 파일(.o)에 반환 타입 정보 없이 함수 이름(signal)만 심볼로 남깁니다.

따라서 링커는 표준 라이브러리(libc)에서 이름이 같은 signal 함수를 찾아 아무 에러 없이 연결해 줍니다.

실행 시 반환값은 레지스터에서 자연스럽게 무시됩니다.

실제 signal 함수는 실행 후 반환값(이전 핸들러 주소)을 CPU 레지스터(RAX)에 담아 돌려줍니다.

하지만 main 함수에서는 반환 타입을 void로 알고 있어 그 레지스터 값을 읽지 않고 무시한 채

다음 줄로 넘어가므로 충돌 없이 정상 작동합니다.

강의에서는 원래의 복잡한 원형(void (*signal(int, void (*)(int)))(int);)

대신, '두 번째 인자로 함수 포인터를 넘긴다'는 핵심에 집중하기 위해 반환 타입을

void로 단순화하여 보여드린 것입니다.

(단, <signal.h>를 #include 하면 원형이 충돌해 컴파일 에러가 발생합니다.)

더 궁금한 점이 있다면 언제든 질문해 주세요!

홀센서 순서, 슈미트 트리거 풀업 저항 질문

0

45

1

20강 4분 30초 코드와 6분 30초 코드 관련 질문

0

47

1

Vivado 설치 / download 불가

1

58

2

영상에서 소개되는 코드와 강의 노트 코드가 달라요

0

50

1

오디오 문제

0

61

2

관련 제품 정보 문의

0

52

1

쓰레드 상태 관련 질문입니다.

0

54

2

runpod에서 실습하는 내용이 조금 다릅니다.

0

42

1

DACL 질문

0

59

1

dc bias 고려

0

62

1

DLL 제작자가 PDB도 같이 제공해야 한다는 설명에 질문

0

51

2

안녕하세요. 저전력 B키트 사용해서 DC 모터 구동을 해보려고 합니다.

0

50

2

정처기 2026-3 실기 문의

0

111

2

정처기 실기 3회 컴싸 사용 여부

0

75

1

두번째 SystemClock_Config(): 여기가 디버깅이 계속 안걸려요

0

47

1

모의고사 1 회 2번문제 중

0

85

2

26-2 이론문제 재탕

1

62

1

26-2년도 코드문제

0

42

0

26-2 코드문제

0

51

1

uart 실습, 입력 커패시터 선정 식, 프리휠링 다이오드 평균 전류

0

62

1

15분 48초 질문

0

71

2

26-1년도 이론문제 재탕

0

76

1

주소에서 &기호 질문

0

92

1

fputs에서 fwrite 로 변경 후 버퍼타입이 헷갈리는데요

0

178

1