免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: BillStone
打印 上一主题 下一主题

[C] 【原创-完结】学习笔记-学习《精通UNIX下C语言编程及项目实践》 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-04-19 17:49 |只看该作者
添加了学习要点5、6

论坛徽章:
0
12 [报告]
发表于 2009-04-21 13:50 |只看该作者
更新了学习要点07

论坛徽章:
0
13 [报告]
发表于 2009-04-23 10:48 |只看该作者
回答学习要点06中“全局跳转”问题<红色标记>:
  
  我重新阅读了APUE中关于setjmp的章节,截出关于该问题的解答:
  "what are the states of the automatic variables and register variables in the main function?" When main is returned to by the longjmp, do these variables have values corresponding to when the setjmp was previously called, or are their values left alone so that their values left alone so that their values are whatever they were when do_line was called? Unfortunately, the answer is "it depends."

  下面以一个实例看下具体情况:
代码:
  1. #include <setjmp.h>
  2. #include <stdio.h>

  3. static void f1(int, int, int, int);
  4. static void f2(void);

  5. static jmp_buf jmpbuffer;
  6. static int globval;

  7. int main(void)
  8. {
  9.     int autoval;
  10.     register int regival;
  11.     volatile int volaval;
  12.     static int statval;

  13.     globval = 1;
  14.     autoval = 2;
  15.     regival = 3;
  16.     volaval = 4;
  17.     statval = 5;
  18.     if(setjmp(jmpbuffer) != 0){
  19.         printf("after longjmp: \n");
  20.         printf("globval = %d, autoval = %d, regival = %d, volaval = %d, statval = %d\n", globval, autoval, regival, volaval, statval);
  21.         exit(0);
  22.     }
  23.          globval = 91;
  24.         autoval = 92;
  25.         regival = 93;
  26.         volaval = 94;
  27.         statval = 95;

  28.     f1(autoval, regival, volaval, statval);
  29.     exit(0);
  30. }

  31. static void f1(int i, int j, int k, int l){
  32.     printf("in f1():\n");
  33.     printf("globval = %d, autoval = %d, regival = %d, volaval = %d, statval = %d\n", globval, i, j, k, l);
  34.     f2();
  35. }

  36. static void f2(void){
  37.     longjmp(jmpbuffer, 1);
  38. }
复制代码

  下面是在Red Hat9上的运行结果:
代码:
  1. [bill@billstone Unix_study]$ uname -a
  2. Linux billstone 2.4.20-8 #1 Thu Mar 13 17:18:24 EST 2003 i686 athlon i386 GNU/Linux
  3. [bill@billstone Unix_study]$ ./testjmp
  4. in f1():
  5. globval = 91, autoval = 92, regival = 93, volaval = 94, statval = 95
  6. after longjmp:
  7. globval = 91, autoval = 92, regival = 93, volaval = 94, statval = 95
  8. [bill@billstone Unix_study]$
复制代码

  在Ubuntu上的测试结果:
代码:
  1. billstone@ubuntu:~/Unix_C$ uname -a
  2. Linux ubuntu 2.6.24-22-generic #1 SMP Mon Nov 24 19:35:06 UTC 2008 x86_64 GNU/Linux
  3. billstone@ubuntu:~/Unix_C$ ./testjmp
  4. in f1():
  5. globval = 91, autoval = 92, regival = 93, volaval = 94, statval = 95
  6. after longjmp:
  7. globval = 91, autoval = 92, regival = 93, volaval = 94, statval = 95
  8. billstone@ubuntu:~/Unix_C$
复制代码

  可以看到在这两个系统上setjmp并没有将自动变量和寄存器变量回复到之前的状态。
  
  大家如果使用着其他系统,请测试一下并将结果发上来一起探讨。

论坛徽章:
0
14 [报告]
发表于 2009-04-23 13:27 |只看该作者
更新了学习要点08

论坛徽章:
0
15 [报告]
发表于 2009-04-25 00:42 |只看该作者
更新了学习要点09

论坛徽章:
0
16 [报告]
发表于 2009-04-25 20:39 |只看该作者
更新了学习要点10

论坛徽章:
0
17 [报告]
发表于 2009-04-30 10:01 |只看该作者
更新了学习要点11

论坛徽章:
0
18 [报告]
发表于 2009-05-03 22:13 |只看该作者
更新了学习要点12

论坛徽章:
0
19 [报告]
发表于 2009-05-04 10:33 |只看该作者
一起学习

论坛徽章:
0
20 [报告]
发表于 2009-05-04 10:36 |只看该作者
东西很赞,关注中
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP