我有兩個線程的進程。一個線程(線程A)將設置timerfd定時器,而另一個線程(線程B)將在這些定時器上執行「選擇」。一旦定時器到期,線程B將指示線程A.如何使文件描述符上的選擇塊
要添加定時器,線程A將創建一個新的定時器,然後它將喚醒線程B以在其調用中包含此定時器以進行選擇。我試圖通過使用文件描述符來喚醒線程B,僅用於此目的。然後線程B會調用該FD上的select以及調用timerfd返回的所有FD。
問題是,我無法設法創建一個FD,我可以通過某種方式進行控制,以便在需要時使選擇阻止或返回。
我曾嘗試使用的shm_open與調用了fcntl,我已經試過只使用打開一個文件,但沒有人會導致選擇阻止。我所有的嘗試都會導致select立即返回。有什麼辦法可以創建一個FD,它會導致select被阻塞,直到我以某種方式更新該FD爲止?
嘗試1 - 創建一個的shm_open FD和使用的fcntl設置讀鎖:
從線程A創建FD
if((wakeUpFd = shm_open("/wakeup", O_RDWR|O_CREAT|O_TRUNC, 0)) == -1)
printf("Failed to open /wakeup, Errno = %d\n", errno);
else
{
fcntl(wakeUpFd, F_SETLK, F_RDLCK);
}
從線程A添加計時器
#create a timer and add it to a list
/* wake up timer thread */
fcntl(wakeUpFd, F_SETLK, ~F_RDLCK);
喚醒線程B
#when select returns
if(FD_ISSET(wakeUpFd, &timerSet))
{
fcntl(wakeUpFd, F_SETLK, F_RDLCK);
}
#check all other timer FD's
嘗試2 - 應使用shm_open和讀/寫數據到它:
從線程A創建FD
if((wakeUpFd = shm_open("/wakeup", O_RDWR|O_CREAT|O_TRUNC, 0)) == -1)
printf("Failed to open /wakeup, Errno = %d\n", errno);
else
{
if(ftruncate(wakeUpFd, 2) == -1)
{
printf("Failed with ftruncate, Errno = %d\n", errno);
}
}
從線程A
#create a timer and add it to a list
/* wake up timer thread */
if(write(wakeUpFd, wakeUpStr, 1) != 1)
printf("Failed to write to wakeUpFd\n");
喚醒線程B
添加計時器#when select returns
if(FD_ISSET(wakeUpFd, &timerSet))
{
read(wakeUpFd, wakeUpBuf, 10);
}
#check all other timer FD's
嘗試3 - 差不多一樣的嘗試2,但使用開放式的,而不是的shm_open。
嘗試4 - 同試試1,但用的fcntl(wakeUpFd,F_SETFL,〜O_NONBLOCK),而不是的fcntl(wakeUpFd,F_SETLK,〜F_RDLCK)
歡迎來到Stack Overflow。請儘快閱讀[常見問題]。你在這裏做了一個很好的工作來解釋你所嘗試過的東西,並且在詢問之前明確地嘗試了相當的數量。做得好。 –