2013-04-25 2 views
-1

В коде сервера я хочу использовать pselect, чтобы ждать, пока клиенты будут подключаться, а также отслеживать стандартный вывод создаваемых мной prozesses и отправлять их клиенту (например, упрощенную удаленную оболочку).Использование pselect для синхронного ожидания

Я попытался найти примеры того, как использовать pselect, но я их не нашел. Сокет, в котором клиент может подключиться, уже настроен и работает, поскольку я проверил, что с accept(). SIGTERM заблокирован.

Вот код, где я пытаюсь использовать pselect:

waitClient() 
{ 
    fd_set readers; 
    fd_set writers; 
    fd_set exceptions; 
    struct timespec ts; 

    // Loop until we get a sigterm to shutdown 
    while(getSigTERM() == false) 
    { 
     FD_ZERO(&readers); 
     FD_ZERO(&writers); 
     FD_ZERO(&exceptions); 

     FD_SET(fileno(stdin), &readers); 
     FD_SET(fileno(stdout), &writers); 
     FD_SET(fileno(stderr), &writers); 
     FD_SET(getServerSocket()->getSocketId(), &readers); 
     //FD_SET(getServerSocket()->getSocketId(), &writers); 

     memset(&ts, 0, sizeof(struct timespec)); 
     pret = pselect(FD_SETSIZE, &readers, &writers, &exceptions, &ts, &mSignalMask); 

     // Here pselect always returns with 2. What does this mean? 
     cout << "pselect returned..." << pret << endl; 
     cout.flush(); 
} 
} 

Так что я хочу знать, как ждать с pselect, пока не будет получено событие, поскольку в настоящее время pselect всегда возвращается немедленно со значением 2 Я попытался установить тайм-аут в NULL, но это ничего не меняет.

Возвращаемое значение pselect (если положительное) является filedescriptor, вызвавшим событие?

Я использую fork() для создания новых прожекторов (еще не реализовано). Я знаю, что мне приходится ждать() на них. Могу ли я ждать от них? Полагаю, мне нужно записать сигнал SIGCHILD, так как я могу это использовать? wait() на дочернем блоке также блокирует, или я могу просто заглянуть, а затем продолжить с pselect, иначе мне придется параллельно блокировать ожидания.

ответ

1

Он возвращается немедленно, потому что дескрипторы файла в наборе writers готовы. Стандартные выходные потоки почти всегда будут готовы для записи.

А если проверить select manual page вы увидите, что возвращаемое значение является либо -1 на ошибки, 0 на тайм-аут, и положительное число говорит вам количество дескрипторов файлов, которые готовы.

+0

Так или иначе, нет смысла ждать от писателей? Или только для писателей на сокете? – Devolus

+1

@Devolus Если вы не отправляете большой объем данных в сокеты, очень маловероятно, что блокировки будут блокироваться. Я обнаружил, что на самом деле бесполезно иметь набор записей в большинстве случаев, так как дескрипторы в нем будут в основном готовы. –

+0

Спасибо. Я весь день заходил в Google, но я не нашел описания очень ясным. – Devolus

Смежные вопросы