2017-10-23 2 views
1

저는 C 프로젝트를 진행하고 있습니다. 프로그램이 정상적으로 실행되면 프로그램 끝에서 정리를 수행합니다. 그것은 curl과 mysql, free() char 배열 등을 정리합니다.디버깅 중에 exit() 함수 사용

새로운 루틴을 개발할 때 프로그램 끝에서 정리해야 할 리소스를 할당 할 것입니다. 하지만 새로운 루틴으로 어떤 일이 벌어지는 지 알기 위해 여러 가지를 인쇄하고 다음을 호출합니다. exit (0);

제 질문은 이러한 unceremonious exit 명령을 사용하여 코드를 컴파일 할 때 내 프로그램이 끝날 때 할당되지 않은 리소스를 할당 해제하기에 충분히 똑똑한 Linux 환경입니까? 아니면 시스템 메모리에서 누수가 발생 했습니까?

+2

짧은 대답 : 예. exiting은 모든 소켓과 파이프를 종료하고 프로그램에 의해 할당 된 모든 메모리를 해제합니다. –

+1

누출 될 수있는 특정 공유 리소스 (삭제되지 않은 파일 또는 릴리스되지 않은 IPC 리소스 등)가 있습니다. 그렇지 않은 경우 예입니다. 하위 프로세스이고 상위 프로세스가 사용자에게 권한을 부여하지 않으면 프로세스 테이블 항목이 누출됩니다. – jxh

+0

고마워요. 나는 때때로 ps를 사용하여 프로세스를 확인하고 있는데, 보이지 않는다. 그래서 저는 시스템을 너무 많이 손상시키지 않는다고 가정합니다. 나는 아마이 방법으로 약 100 번이나이 프로그램을 종료했을 것이며, 아직 어떤 부작용도 보지 못했다. 그래서, 분명히, 지금까지 그렇게 좋았습니다. 아니면 jxh가 말한 것을 놓쳤습니까? – mikekehrli

답변

1

예, 메모리는 해제되지만 프로세스가 폐기하는 대신 프로세스가 종료 된 후 어느 시점에서 운영 체제가 메모리를 확보합니다.

극단적 인 경우 RAM이 프로세스와 관련되지 않지만 일시적으로 사용되면 운영 체제가 느려질 수 있습니다. 이것은 "매우"레거시 운영 체제 (20 년 이상 된 것)의 주요 관심사 일뿐입니다.

많은 경우 파일 핸들이 RAM보다 부족하며 새 파일 핸들을 기다릴 때 문제가 발생할 수 있습니다. 그러나 다시 말하지만, 대부분의 최신 운영 체제는 결국 열린 파일 핸들을 회수합니다.

이제 비정상적인 종료 지점에서 정리되지 않은 항목 (semaphores, shared memory 등의 IPC 구조)이 있지만 일반적으로 이러한 항목을 사용하는 경우이를 알 수 있습니다.

+0

감사합니다. 네, IPC, 세마포어 또는 공유 메모리를 사용하고 있지 않습니다. 이것은 현재 단일 스레드 응용 프로그램입니다. 또한 꽤 최근의 리눅스 배포판 (어쨌든 2 년 미만). 나는 정말로 대답에 감사한다. – mikekehrli

+0

@mikekehrli 도움이 되서 기쁩니다! –