2013-04-25 78 views
-1

在服務器代碼中,我希望使用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,否則我不得不同時阻塞等待。

回答

1

它會立即返回,因爲writers集中的文件描述符已準備就緒。標準輸出流幾乎總是準備好寫入。

如果您檢查select manual page,您將看到錯誤返回值爲-1,超時時爲0,正數告訴您準備好的文件描述符的數量。

+0

因此,無論如何等待作家是沒有意義的。還是僅限於插座上的作者? – Devolus 2013-04-25 07:15:41

+1

@Devolus除非您在套接字上發送大量數據,否則寫入調用將不可能被阻止。我發現在大多數情況下寫入集合並不是沒有用,因爲其中的描述符無論如何都將準備就緒。 – 2013-04-25 07:19:24

+0

謝謝。我昨天整天都在Google上搜索,但我沒有找到非常清楚的描述。 – Devolus 2013-04-25 07:32:56