Вас могут заинтересовать wait () и waitpid (), см. http://linux.die.net/man/2/waitpid
Вот неблокирующий пример использования waitpid ():
pid_t child;
int child_status, status;
switch(child = fork()) {
case 0:
/* child process */
do_silly_children_stuff();
exit(42);
case -1:
/* fork() error */
do_some_recovery();
break;
default:
/* parent process */
do_parenting_stuff();
break;
}
// busy-wait for child to exit
for (;;) {
status = waitpid(child, &child_status, WNOHANG);
switch (status) {
case -1:
/* waitpid() error */
break;
case 0:
/* child hasn't exited yet */
break;
default:
/* child with PID $child has exited with return value $child_status */
break;
}
}
Обратите внимание, что я не проверял вышеуказанный код.
Для общего асинхронного межпроцессного взаимодействия вы можете использовать каналы (pipe ()), сокеты, разделяемую память или - будьте осторожны - файлы.