当前位置: 首页 > news >正文

setjmp和longjmp函数使用

这里用最简单直接的描述:这两组函数是用于实现类似vscode全局的标签跳转功能,setjmp负责埋下标签,longjmp负责标签跳转。

#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>jmp_buf envbuf1;
jmp_buf envbuf2;void func_label1()
{int ret = setjmp(envbuf1);printf("func label1 ret:%d.\n",ret);
}void func_label2()
{int ret = setjmp(envbuf2);printf("func label2 ret:%d.\n",ret);
}void test1()
{printf("test1 called.\n");longjmp(envbuf1,100);printf("test1 never run here.\n");
}void test2()
{printf("test2 called.\n");longjmp(envbuf1,200);printf("test2 never run here.\n");
}void test3()
{printf("test3 called.\n");longjmp(envbuf1,300);printf("test3 never run here.\n");
}void test4()
{printf("test4 called.\n");longjmp(envbuf2,400);printf("test4 never run here.\n");
}void test5()
{printf("test5 called.\n");longjmp(envbuf2,500);printf("test5 never run here.\n");
}void main()
{printf("==========Start process======\n");func_label1();func_label2();test1();//label1test2();test3();test4();//label2test5();printf("==========End process======\n");
}

运行效果:

从这个运行结果可以清楚的看到两个标签的跳转效果!

#include <stdio.h>
#include <unistd.h>
#include <setjmp.h>
#include <stdlib.h>typedef struct
{void *private_data;void (*start)(void *);jmp_buf context; // 上下文切换} context;static context *task_list;
static int run_index = 0;
static int index_max = 0;
static int count = 0;static void task0(void *arg)
{printf("task0,arg=%d\n", arg);
}static void task1(void *arg)
{printf("task1,arg=%d\n", arg);
}static void task2(void *arg)
{printf("task2,arg=%d\n", arg);
}static void run(context *ct)
{printf("run_index=%d, count=%d\n", run_index, ++count);ct->start(ct->private_data);   run_index = count % index_max;    sleep(1);longjmp(task_list[run_index].context, 1);//switch to next task
}void task_init(int size)
{task_list = (context *)malloc(size * sizeof(context));
}void create_task(void (*start)(void *), void *arg)
{task_list[index_max].start = start;task_list[index_max].private_data = arg;if (setjmp(task_list[index_max].context)){run(&task_list[run_index]);}index_max++; // 记录创建的任务数量
}void task_start()
{longjmp(task_list[0].context, 1); // 开始第一个任务
}int main()
{task_init(3); // thread max=3create_task(task0, (void *)100);create_task(task1, (void *)101);create_task(task2, (void *)102);task_start();return 0;
}

 

http://www.lryc.cn/news/391727.html

相关文章:

  • vue-org-tree搜索到对应项高亮展开
  • FullCalendar日历组件集成实战(17)
  • 【图像分割】mask2former:通用的图像分割模型详解
  • 【不锈钢酸退作业区退火炉用高温辐射计快速安装】
  • Studying-代码随想录训练营day29| 134. 加油站、135. 分发糖果、860.柠檬水找零、406.根据身高重建队列
  • Understanding Zero Knowledge Proofs (ZKP)
  • 微信小程序 DOM 问题
  • 可视化作品集(03):旅游景区的应用,美爆啦。
  • 嵌入式实时操作系统:Intewell操作系统与VxWorks操作系统有啥区别
  • PCDN技术如何提高内容分发效率?(壹)
  • Java 中Json中既有对象又有数组的参数 如何转化成对象
  • 什么是数据挖掘(python)
  • 【Tomcat】Linux下安装帆软(fineReport)服务器 Tomcat
  • C++ | Leetcode C++题解之第213题打家劫舍II
  • windows系统中快速删除node_modules文件
  • Spring MVC数据绑定和响应——页面跳转(一)返回值为void类型的页面跳转
  • CSS动画keyframes简单样例
  • LabVIEW风机跑合监控系统
  • sql语句练习注意点
  • 如视“VR+AI”实力闪耀2024世界人工智能大会
  • 华为云交付模式和技术支持
  • RK3568平台(opencv篇)ubuntu18.04上安装opencv环境
  • R-CNN:深度学习在目标检测中的革命
  • docker容器技术、k8s的原理和常见命令、用k8s部署应用步骤
  • ThinkPHP定时任务是怎样实现的?
  • [C++][CMake][生成可执行文件][上]详细讲解
  • Asp.net Core 反射加载dll
  • 利用coredump获取程序调用通路
  • DVWA sql手注学习(巨详细不含sqlmap)
  • 代码随想录算法训练营第70天图论9[1]