내 C++ 프로그램은 몇 가지 작업을 수행한 다음 종료하라는 신호를 기다립니다. 종료하고 싶지만 종료하면 SIGCHLD가 상위 프로세스로 전송되므로 해당 시간을 제어해야 합니다.
그래서 현재 나는 다음을 수행합니다.
int main() {
run(); // do stuff, then free() and close() everything possible.
for (;;) pause(); // wait for signal to kill us
return 0;
}
그래서 작업이 끝나면 run()
프로그램은 그대로 앉아서 죽습니다.
"이 프로그램에는 지금 아무것도 필요하지 않습니다. 스택과 다른 모든 것을 해제합니다"라고 말하는 멋진 Linux 방식이 있습니까? 아니면 이미 "가능한 가장 기본적인 프로세스" 단계에 있습니까?
답변1
당신이 말한 대로 해야 한다고 가정하고(의심스럽습니다), 프로그램이 크고 그래서 많은 메모리를 사용한다고 가정합니다.
아이디어 1
exec
다른 작은 프로그램을 사용하여 대기를 수행 할 수 있습니다 .
그러나 가장 효율적인 방법은 종료하는 것입니다. 이 방법은 프로세스 테이블의 항목과 종료 값을 제외한 거의 모든 항목을 해제합니다. 그런 다음 프로세스는 상위 프로세스가 SIGCHLD를 처리할 때까지 좀비가 됩니다(또는 상위 프로세스가 종료되는 경우 `init가 상위 프로세스가 되어 SIGCHLD를 매우 빠르게 처리함).
아이디어 2
래퍼를 작성합니다. 이렇게 하면 자녀가 이를 수정할 필요가 없으며 부모의 열악한 양육 방식을 보완하기 위해 더 이상 자녀의 코드를 왜곡하지 않아도 됩니다.
래퍼에는 하위 프로세스 실행, 대기 및 종료만 포함될 수 있습니다. 예를 들어
int main() {
fork and exec child
wait for child
wait for signal from parent
return child exit code
}