2014-05-21 58 views
1

我需要將文件描述符附加到GLIB主循環。我的問題是文件描述符的列表在執行過程中不固定。在GLIB主循環中添加fds

據GLIB文件,我可以:

  • 創建GIOChannel每個FD用g_io_channel_unix_new,並將其與g_io_add_watch重視上下文
  • 使用Gsource與創建g_io_create_watch並設置回撥g_source_set_callback

我的問題是:是否可以動態修改源或上下文。我該怎麼做?我發現GSourceFuncs的能力,但這不符合我的問題。

感謝您的幫助。

回答

1

g_io_add_watch返回一個事件源ID,您可以稍後使用它來使用g_source_remove再次動態移除手錶。每個FD使用一個事件源,而不是修改現有的手錶,刪除舊手錶並創建適當的新手錶。

+0

感謝。但是在哪些代碼中,我應該實現刪除/添加功能?因爲如果我使用GIOChannel,我只有主要和回調。 – amenophiks

+0

這取決於你的代碼。既然你不知道在哪裏添加它,我是否假設你無法控制這個列表? (如果有的話,答案是你應該在你改變列表的地方添加代碼。)你能否用一些背景擴展你的問題? – Phillip

1

我挖更進GLIB現在:

  • 我創建回調函數(準備,檢查,調度,最後確定)
  • 在製備回調的源極,FD使用g_source_remove_unix_fd已刪除()和然後使用g_source_add_unix_fd()將其添加到當前源。
  • 我返回FALSE,設置超時時間(1秒我的例子)

我的問題是,如果沒有FD,該準備的回調被稱爲每1秒預期。當添加FD時,準備回調被調用而沒有超時。該調查直接退出。

我看看GLIB的源代碼,但不明白爲什麼?

請幫助 問候

0

amenophiks的回答是最好的。

如果你希望你的代碼與舊的巧舌如簧工作你可以使用:

  • g_source_add_poll()
  • g_source_remove_poll()