longjmp在windows使用getaddrinfoDNS 報文結構和個人 DNS 解析代碼實現——解決 getaddrinfo() 阻塞問題

DNS 報文結構和個人 DNS 解析代碼實現——解決 getaddrinfo() 阻塞問題
https://segmentfault.com/a/1190000009369381
https://www.zhihu.com/question/51873250
注意:這個函數不能在回調中使用,比如網絡上常見的信號配合使用就會出錯。
或者定時器配合使用也會出錯,這就是windows上使用的坑。
記住:不要在回調中longjmp

Longjmp函數將還原以前通過setjmp env保存的堆棧環境和執行區域設置。 setjmp和longjmp提供了一種方法來執行非本地goto;它們通常用於將執行控制傳遞給之前調用的例程中的錯誤處理或恢復代碼,而不使用正常調用和返回約定。
對的調用setjmp會導致當前堆棧環境保存在環境中。 對longjmp的後續調用將還原保存的環境,並將控制權返回到緊靠相應setjmp調用之後的點。 執行將繼續,就好像剛剛通過 setjmp 調用返回 value 一樣。 例程接收控件可訪問的所有變量(寄存器變量除外)的值包含在調用longjmp時所具有的值。 寄存器變量的值是不可預知的。 setjmp 返回的值必須爲非零。 如果將 value 作爲 0 傳遞,在實際返回中將替換值 1。
Microsoft 專用
在 Windows C++上的 Microsoft 代碼中, longjmp使用與異常處理代碼相同的堆棧展開語義。 可以安全地在可以引發C++異常的同一位置中使用。 但是,這種用法不可移植,並附帶一些重要的注意事項。
僅在調用setjmp的函數返回前調用 longjmp,否則結果是不可預知的。
使用longjmp時,請注意以下限制:
不要假定寄存器變量的值保持不變。 執行setjmp longjmp後,無法將調用例程中的寄存器變量的值還原爲正確的值。
除非中斷是由浮點異常引起的,否則不要使用longjmp將控制轉移出中斷處理例程。 在這種情況下,如果第一次通過調用_fpreset重新初始化浮點數學包,程序可能會通過longjmp從中斷處理程序返回。
不要使用longjmp從 Windows 代碼直接或間接調用的回調例程傳輸控件。
如果代碼是使用 /ehs或 /ehsc編譯的,並且包含longjmp調用的函數是noexcept ,則該函數中的本地對象在堆棧展開過程中可能不會被銷燬。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章