2
0

jmp.cpp 961 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. /*
  2. # see: https://ossrs.net/lts/zh-cn/docs/v4/doc/arm
  3. g++ -g -O0 -o jmp jmp.cpp
  4. arm-linux-gnueabi-g++ -o jmp jmp.cpp -static
  5. arm-linux-gnueabi-strip jmp
  6. */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <unistd.h>
  10. #include <setjmp.h>
  11. bool func1_ok = false, func2_ok = false;
  12. jmp_buf env_func1, env_func2;
  13. int sum = 0;
  14. void func1() {
  15. int ret = setjmp(env_func1);
  16. printf("[func1] setjmp ret=%d, sum++=%d\n", ret, sum++);
  17. func1_ok = true;
  18. sleep(1);
  19. // jmp to func2
  20. if (func2_ok) {
  21. longjmp(env_func2, 1);
  22. }
  23. }
  24. void func2() {
  25. int ret = setjmp(env_func2);
  26. printf("[func2] setjmp ret=%d, sum++=%d\n", ret, sum++);
  27. func2_ok = true;
  28. sleep(1);
  29. // jmp to func1
  30. if (func1_ok) {
  31. longjmp(env_func1, 2);
  32. }
  33. }
  34. int main(int argc, char** argv) {
  35. printf("hello, setjmp/longjmp!\n");
  36. func1();
  37. func2();
  38. printf("jmp finished, sum=%d\n", sum);
  39. return 0;
  40. }