在服務器代碼中,我希望使用pselect等待客戶端連接以及監視我創建的標準輸出並將其發送到客戶端(如簡化的遠程shell)。使用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(如果爲positive)的返回值是導致該事件的filedescriptor?我使用fork()來創建新的prozesses(尚未實現)我知道我必須等待()他們。我可以等他們嗎?我想我需要聊天信號SIGCHILD,那麼我將如何使用它? wait()對孩子也會阻塞,或者我可以只查看一下,然後繼續pselect,否則我不得不同時阻塞等待。
因此,無論如何等待作家是沒有意義的。還是僅限於插座上的作者? – Devolus 2013-04-25 07:15:41
@Devolus除非您在套接字上發送大量數據,否則寫入調用將不可能被阻止。我發現在大多數情況下寫入集合並不是沒有用,因爲其中的描述符無論如何都將準備就緒。 – 2013-04-25 07:19:24
謝謝。我昨天整天都在Google上搜索,但我沒有找到非常清楚的描述。 – Devolus 2013-04-25 07:32:56