보통 유닉스 계열의 프로세스가 0을 반환했을때 의도한 목적을 정상적으로 처리하고 종료한 상태(일부 조건 명령어의 경우 반환값을 참과 거짓으로 나타내기도 한다.), 0이 아니면 종료 자체는 정상적으로 이루어졌지만 내부 처리에서 문제가 발생했음을(필수 인자 누락, 시스템 또는 라이브러리 함수 호출의 이상 등) 나타냄.

중간에 프로그램을 강제종료시키기 위해 exit 함수를 호출하는 경우가 많은데 라이브러리 함수이지만 결국 프로세스를 종료시키는 시스템 호출이 이루어진다.


그런데 반환값으로는 심각한 문제가 발생했는지 알기 어렵고(일단 정상적인 방법으로 프로세스가 종료했기 때문에) 프로그램마다 반환값의 의미가 다르므로 진짜 심각한 문제가 발생했을때는 어떤 함수를 호출해야 할까? 답은 abort(3) 라이브러리 함수이다.

이 함수는 SIGABRT 시그널을 발생시키고 코어 덤프를 생성함. 만약에 시그널 처리 핸들러가 변경된 상태여도 강제로 복구하고 시그널을 발생시키기 때문에 프로그램의 비정상적인 상황을 나타내는데 쓰임. 이런 시그널을 발생시키는 함수가 몇가지 더 있긴 한데 assert가 그 예로 이 함수는 특정 조건값이 거짓일 경우 비슷하게 강제종료시킴.

아마 대부분 비정상종료가 언제 어디에 쓰일지 잘 모를수도 있다. 일반적인 상황에서는 잘 안쓰이기 때문임. 만약 정상적인 값을 받은 줄 알고 처리하고 있었는데 그게 잘못된 값이였다면 더 늦기 전에 강제종료라도 시켜야 함. 애초에 그런 일이 일어나지 않도록 해야하는게 C 프로그래머의 기본 소양이지만 인간은 항상 실수를 하기 때문에 다만 실수를 최대한 줄이기 위해서 이런 대책을 세워두는게 좋지 않을까?

결론 :
1. exit 함수는 라이브러리 호출, 라이브러리가 알아서 시스템의 프로세스 종료 함수를 호출.
2. abort 함수는 라이브러리 호출이지만 SIGABRT 시그널을 발생시키고 프로세스 종료 함수의 호출 없이 커널단에서 프로세스를 강제 종료시킴.