我正在製作一個非常簡單的程序,它由客戶端和服務器進程使用的一個小型API組成。客戶端進程和服務器進程通過一對FIFO進行通信(一個向服務器發送請求,另一個向服務器發送響應)。無法同步阻止讀取和寫入FIFO
- 服務器不斷讀取請求FIFO與封閉讀取(O_RDWR標誌)
- 客戶寫FIFO(O_WRONLY標誌)
- 服務器讀取請求的請求的請求時,它適用於並在響應FIFO(O_WRONLY標誌)上寫入響應
- 客戶端讀取響應(O_RDONLY標誌):如果服務器沒有傳送任何數據(我的意思是一個未定義的長緩衝區),則寫入的響應先進先出足夠了,工作完成
- 其他...
- 的客戶端服務器將要發送的數據的響應讀取,所以它打開的答覆再次FIFO(O_RDONLY標誌)
- 服務器(O_WRONLY標誌)
最後寫沒有按寫入數據在客戶閱讀另一面之前,似乎不會阻止服務器進程:爲什麼?我錯過了什麼? 爲了實現我的目標,我必須在寫入調用之前先進行睡眠(1),但這僅適用於對服務器的某種請求:我該如何幫助您來幫助我?
服務器代碼
/* until here everything is ok: client read the response and waits for the buffer */
sleep(1);
/* open the FIFO and send the buffer */
if((fifofrom = open(FIFOFROMMMBOXD, O_WRONLY)) == -1) logMmboxd("error in opening FIFOFROM again for the buffer\n", 1);
else logMmboxd("opened FIFOFROM again for the buffer\n", 0);
if((write(fifofrom, mails, sizeof(mmbox_mail_complete)*m)) != sizeof(mmbox_mail_complete)*m) logMmboxd("error in writing FIFOFROM again for the buffer\n", 1);
else logMmboxd("written on FIFOFROM again for the buffer\n", 0);
close(fifofrom);
logMmboxd("messages list definitely sent\n", 0);
客戶端代碼
void lockUp(Request *request, Response *response, void **buffer)
{
int fifofrom, fifoto, lock;
/* lockto access the FIFOs */
if((lock = open(LOCK, O_RDONLY)) == -1) logMmboxman("error in opening LOCK\n", 1);
else logMmboxman("opened LOCK\n", 0);
if(flock(lock, LOCK_EX) == -1) logMmboxman("error in acquiring LOCK\n", 1);
else logMmboxman("acquired LOCK\n", 0);
/* open the FIFO and write the request */
if((fifoto = open(FIFOTOMMBOXD, O_WRONLY)) == -1) logMmboxman("error in opening FIFOTO\n", 1);
else logMmboxman("opened FIFOTO\n", 0);
if((write(fifoto, request, sizeof(Request))) != sizeof(Request)) logMmboxman("error in writing FIFOTO\n", 1);
else logMmboxman("written on FIFOTO\n", 0);
close(fifoto);
/* waiting for response on FIFOFROM */
if((fifofrom = open(FIFOFROMMMBOXD, O_RDONLY)) == -1) logMmboxman("error in opening FIFOFROM\n", 1);
else logMmboxman("opened FIFOFROM\n", 0);
if((read(fifofrom, response, sizeof(Response))) != sizeof(Response)) logMmboxman("error in reading FIFOFROM\n", 1);
else logMmboxman("read from FIFOFROM\n", 0);
close(fifofrom);
/* if size>0 then the server has to send a buffer of data to me! */
if(response->size)
{
if((fifofrom = open(FIFOFROMMMBOXD, O_RDONLY)) == -1) logMmboxman("error in opening FIFOFROM again for the buffer\n", 1);
else logMmboxman("opened FIFOFROM again for the buffer\n", 0);
*buffer = (void*)malloc(response->size);
if(read(fifofrom, *buffer, response->size) != response->size) logMmboxman("error in reading FIFOFROM again for the buffer\n", 1);
else logMmboxman("read from FIFOFROM again for the buffer\n", 0);
close(fifofrom);
}
/* read the response: I release the lock */
if(flock(lock, LOCK_UN) == -1) logMmboxman("error in releasing LOCK\n", 1);
else logMmboxman("released LOCK\n", 0);
return;
}
請發表編碼。根據你的描述不可能修復。 – Hogan 2011-05-21 13:43:43
好的,我發佈了一些代碼:) – 2011-05-21 13:46:54
我懷疑在這個應用程序中使用UNIX域套接字而不是FIFO會好得多。首先,它們是雙向的。 – caf 2011-05-23 06:53:52