Suponha que você tenha que fazer o que você diz (o que duvido), e suponha que seu programa seja grande, então usa muita memória.
ideia 1
Você poderia exec
outro programa menor, para fazer a espera.
No entanto, a maneira mais eficiente é sair, isso libera quase tudo, exceto sua entrada na tabela de processos e seu valor de saída. O processo se tornará um zumbi, até que o pai lide com o SIGCHLD (ou o pai morre, no caso em que 'init se torna pai e manipula SIGCHLD muito rapidamente).
Idéia 2
Escreva um wrapper. Dessa forma, a criança não precisa modificar, você não está mais distorcendo o código filho, para compensar a má paternidade.
O wrapper pode conter nada mais que, execute child, wait, exit. por exemplo,
int main() {
fork and exec child
wait for child
wait for signal from parent
return child exit code
}