操作C说话中的Setjmp和Longjmp,来完美非常捕捉和协程
在 C 尺度库中,有两个威力很猛的函数:setjmp 和 longjmp,不知道列位小搭档在代码中是否行使过?我问了身材的几位同事,一部门人不熟悉这两个函数,有一部门人知道这个函数,但从来没有行使过。 从常识点范畴来看,这两个函数的成果较量纯真,一个简朴的示例代码就能说清晰了。可是,我们必要从这个常识点举办发散、思索,在差异的维度上,把这个常识点与这个编程说话中其余相同的常识举办遐想、比拟;与其他编程说话中相同的观念举办较量;然后再思索这个常识点可以行使在哪些场所,别人是怎么来行使它的。 本日,我们就来掰扯掰扯这两个函数。固然在一样平常的措施中行使不上,可是在此后的某个场所,当你必要处理赏罚一些较量怪异的措施流程时,大概它们可以给你带来意想不到的结果。 譬喻:我们会把 setjmp/longjmp 与 goto 语句举办成果上的较量;与 fork 函数从返回值长举办类比;与 Python/Lua 说话中的协程举办行使场景上的较量。 二、函数语法先容 1. 最简示例 先不讲原理,直接看一下这个最简朴的示例代码,看不懂也不要紧,混个脸熟: int main() { // 一个缓冲区,用来暂存情形变量 jmp_buf buf; printf("line1 n");
// 生涯而今的上下文信息 int ret = setjmp(buf); printf("ret = %d n", ret);
// 搜查返回值范例 if (0 == ret) { // 返回值0:声名是正常的函数挪用返回 printf("line2 n");
// 主动跳转到 setjmp 那条语句处 longjmp(buf, 1); } else { // 返回值非0:声名是从长途跳转过来的 printf("line3 n"); } printf("line4 n"); return 0; (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |