보통 유닉스 계열의 프로세스가 0을 반환했을때 의도한 목적을 정상적으로 처리하고 종료한 상태(일부 조건 명령어의 경우 반환값을 참과 거짓으로 나타내기도 한다.), 0이 아니면 종료 자체는 정상적으로 이루어졌지만 내부 처리에서 문제가 발생했음을(필수 인자 누락, 시스템 또는 라이브러리 함수 호출의 이상 등) 나타냄.
중간에 프로그램을 강제종료시키기 위해 exit 함수를 호출하는 경우가 많은데 라이브러리 함수이지만 결국 프로세스를 종료시키는 시스템 호출이 이루어진다.
그런데 반환값으로는 심각한 문제가 발생했는지 알기 어렵고(일단 정상적인 방법으로 프로세스가 종료했기 때문에) 프로그램마다 반환값의 의미가 다르므로 진짜 심각한 문제가 발생했을때는 어떤 함수를 호출해야 할까? 답은 abort(3) 라이브러리 함수이다.
이 함수는 SIGABRT 시그널을 발생시키고 코어 덤프를 생성함. 만약에 시그널 처리 핸들러가 변경된 상태여도 강제로 복구하고 시그널을 발생시키기 때문에 프로그램의 비정상적인 상황을 나타내는데 쓰임. 이런 시그널을 발생시키는 함수가 몇가지 더 있긴 한데 assert가 그 예로 이 함수는 특정 조건값이 거짓일 경우 비슷하게 강제종료시킴.
아마 대부분 비정상종료가 언제 어디에 쓰일지 잘 모를수도 있다. 일반적인 상황에서는 잘 안쓰이기 때문임. 만약 정상적인 값을 받은 줄 알고 처리하고 있었는데 그게 잘못된 값이였다면 더 늦기 전에 강제종료라도 시켜야 함. 애초에 그런 일이 일어나지 않도록 해야하는게 C 프로그래머의 기본 소양이지만 인간은 항상 실수를 하기 때문에 다만 실수를 최대한 줄이기 위해서 이런 대책을 세워두는게 좋지 않을까?
결론 :
1. exit 함수는 라이브러리 호출, 라이브러리가 알아서 시스템의 프로세스 종료 함수를 호출.
2. abort 함수는 라이브러리 호출이지만 SIGABRT 시그널을 발생시키고 프로세스 종료 함수의 호출 없이 커널단에서 프로세스를 강제 종료시킴.
중간에 프로그램을 강제종료시키기 위해 exit 함수를 호출하는 경우가 많은데 라이브러리 함수이지만 결국 프로세스를 종료시키는 시스템 호출이 이루어진다.
그런데 반환값으로는 심각한 문제가 발생했는지 알기 어렵고(일단 정상적인 방법으로 프로세스가 종료했기 때문에) 프로그램마다 반환값의 의미가 다르므로 진짜 심각한 문제가 발생했을때는 어떤 함수를 호출해야 할까? 답은 abort(3) 라이브러리 함수이다.
이 함수는 SIGABRT 시그널을 발생시키고 코어 덤프를 생성함. 만약에 시그널 처리 핸들러가 변경된 상태여도 강제로 복구하고 시그널을 발생시키기 때문에 프로그램의 비정상적인 상황을 나타내는데 쓰임. 이런 시그널을 발생시키는 함수가 몇가지 더 있긴 한데 assert가 그 예로 이 함수는 특정 조건값이 거짓일 경우 비슷하게 강제종료시킴.
아마 대부분 비정상종료가 언제 어디에 쓰일지 잘 모를수도 있다. 일반적인 상황에서는 잘 안쓰이기 때문임. 만약 정상적인 값을 받은 줄 알고 처리하고 있었는데 그게 잘못된 값이였다면 더 늦기 전에 강제종료라도 시켜야 함. 애초에 그런 일이 일어나지 않도록 해야하는게 C 프로그래머의 기본 소양이지만 인간은 항상 실수를 하기 때문에 다만 실수를 최대한 줄이기 위해서 이런 대책을 세워두는게 좋지 않을까?
결론 :
1. exit 함수는 라이브러리 호출, 라이브러리가 알아서 시스템의 프로세스 종료 함수를 호출.
2. abort 함수는 라이브러리 호출이지만 SIGABRT 시그널을 발생시키고 프로세스 종료 함수의 호출 없이 커널단에서 프로세스를 강제 종료시킴.
스오플도 그렇고 비추만 박고 이유는 말안하는거 이해가 안됨
스오플에서도 그런거면 말 다했지 뭐
스오플이 어디?
스택오버플로 말하는거 같은데
이런것도 있었구만
+ 사실 kill 호출에 getpid로 자기 자신에게 SIGABRT 시그널을 보내는 것도 abort 호출과 비슷한 효과를 낼 수 있지만 시그널 처리 핸들러를 원래대로 되돌리지 않는다는 점에서 다름. 즉 kill은 시그널을 거부한 상황으로 인해 실패할 수도 있지만 abort는 절대로 실패하지 않음. (절대로 반환하지 않고 그 자리에서 비정상 강제종료)
뭐야 왜 비추인지 이유 설명좀 해줘
os가 터지면 될 문제
시간이 좀 지났지만 나중에 읽어볼 갤럼을 위해 추가 설명하자면 시그널을 거부한게 아니라 사용자 지정 시그널 처리 핸들러를 정의한 경우에는 그 핸들러 함수가 먼저 처리되고 종료될때 기본 시그널 처리 핸들러가 실행됨. 그리고 SIGABRT 시그널은 코어를 덤프하는 부가적인 역할이 있음.
프로그램에 심각한 문제가 발생했으므로 이 코어 덤프를 개발자에게 전달해서 원인 분석에 도움을 주라는 의미와 비슷함.