91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

setjmp的使用方法

發布時間:2021-07-12 10:44:52 來源:億速云 閱讀:124 作者:chen 欄目:大數據

這篇文章主要講解了“setjmp的使用方法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“setjmp的使用方法”吧!

以前對于C語言的setjmp和longjmp從來都是知道有這么個函數, 但是不知道什么情況下要使用, 甚至于不知道setjmp的實現機制是什么樣子的.

這次在<a href="https://github.com/findstr/coroutine" title="實現coroutine的過程中">實現coroutine的過程中</a>雖然沒有使用setjmp來實現, 但是由于setjmp來實現coroutine的所有操作都是可以在用戶態進行的, 因此順便研究了一下<a href="http://www.jbox.dk/sanos/source/lib/setjmp.c.html" title="setjmp的實現機制">setjmp的實現機制</a>.

與我猜測大致一樣, 在call stack上來講setjmp一定先于或等于longjmp處于的位置, 這樣其實longjmp所做的不過就是將當前寄存器上下文恢復成setjmp函數保存的值即可. 調用longjmp的函數與調用setjmp的函數共用一個棧空間, 因此longjmp恢復完寄存器后造成的結果就是恢復寄存器上下文并將棧空間釋放到setjmp位于的地方.

那么這就很好解釋為什么不能將setjmp使用函數再封裝一層了, 假設使用函數封裝setjmp代碼如下:

<code>

int try(jmp_buf jmp)

{

        int err;

        err = setjmp(jmp);

        printf("%d\n", err);

        return err;

}

void execption(jmp_buff j, int err)

{

        return longjmp(j, err)

}

int main()

{

        jmp_buff j;

        try(j);

        execption(j, 2);

}

</code>

如上代碼其實try函數與execption共用部分棧空間, 當longjmp回到try函數時, 即使用寄存器被恢復了, 但是事實上try函數的棧結構已經被破壞了, 此時longjmp之后try函數的行為是無法預料的.

<pre>

------------------------

|        main          |

|-----------------------

|     try |  excption  |

|---------|            |

|---------|------------|

</pre>

在使用setjmp時一定要注意棧是否被覆蓋的問題, 即調用setjmp時所保存的esp的信息直到調用前longjmp之前, 不應該會出更有比setjmp保存esp時更多的空閑空間(如棧是自頂向下增加, 則setjmp到longjmp之間出現的esp的值絕不能大于setjmp保存的esp的值.

感謝各位的閱讀,以上就是“setjmp的使用方法”的內容了,經過本文的學習后,相信大家對setjmp的使用方法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

林西县| 林芝县| 黄龙县| 古交市| 武陟县| 镇沅| 团风县| 霍州市| 蒲江县| 吉木萨尔县| 灵武市| 合山市| 长治市| 海口市| 西吉县| 新竹市| 晋州市| 泾川县| 昌宁县| 武功县| 汉源县| 邵阳市| 肇源县| 确山县| 庐江县| 朝阳县| 台中市| 丹凤县| 吉林省| 洪雅县| 杭锦后旗| 泾川县| 阆中市| 邢台县| 独山县| 莱芜市| 拉萨市| 瓦房店市| 浠水县| 日土县| 清河县|