Ответ @DanielPorteous должен работать, если вы не хотите использовать поток в своей программе.
Идея проста, не сохраняя функции waitpid
и read
, чтобы ждать, если они не потратят некоторое время на выполнение своей работы. Идея заключается в том, чтобы сохранить механизм тайм-аута, чтобы, если waitpid
не имеет ничего, чтобы создать воздействие на всю операцию, он немедленно вернется, и то же самое произойдет и для операции чтения.
Если функция read
занимает очень много времени, чтобы прочитать весь буфер, вы можете ограничить чтение вручную из функции read
, чтобы она не читала целое сразу, а читала ее в течение 2 миллисекунд, а затем передавала цикл до функции waitpid
для выполнения.
Но его безопасно использовать резьбу для вашей цели и ее довольно легко реализовать. Here's a nice guideline о том, как вы можете реализовать потоки.
В вашем случае вам нужно объявить два потока.
pthread_t readThread;
pthread_t waitpidThread;
Теперь вам нужно создать поток и передать определенную функцию в качестве параметра.
pthread_create(&(waitpidThread), NULL, &waitpidFunc, NULL);
pthread_create(&(readThread), NULL, &readFunc, NULL);
Теперь вы, возможно, придется написать waitpidFunc
и readFunc
функцию. Они могут выглядеть так.
void* waitpidFunc(void *arg)
{
while(true) {
pid_t pid = waitpid(...);
// This is to put an exit condition somewhere.
// So that you can finish the thread
int exit = process_waitpid_event(...);
if(exit == 0) break;
}
return NULL;
}
Вы хотите сделать это асинхронным способом? –
Это больше похоже на проблему с потоками. Вы можете найти, как потоки могут быть реализованы в C. –
Просьба подробно остановиться на вашей проблеме. Что за ожидание и от чего вы читаете. В частности, есть ли случай, когда вы просто имеете один дочерний процесс и хотите прочитать его вывод, но просто нужно знать, когда он закончится? –