免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 15157 | 回复: 30
打印 上一主题 下一主题

编程知识积累贴. [复制链接]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-07-06 12:22 |只看该作者 |倒序浏览
知识是不断的积累的.

希望进入此贴的人,留下自己的一点编程心得,一点体会,那怕是一个很小的知识点.与大家一起分享,共同进步.
(不限语言).

回复都将有加分的奖励.


注:回复不存在实际意义的帖子将被删除.

论坛徽章:
0
2 [报告]
发表于 2006-07-06 16:49 |只看该作者
十年学会编程
编程涉及到的面实在太广/
不仅是编程的思想,对于代码,你要理解到你的程序如何在计算机上运行,如何在内存中分配,在CPU上的优先级,等等.
作为一个优秀的程序员,不仅是是上层的代码,对于底层的硬件也应该很了解.精通.

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2006-07-08 11:14 |只看该作者

LINUX取得本机IP的简单C程序,不用自己写ioctl

  1. //代码根据UNP和man手册编写
  2. //适用于LINUX/BSD(FreeBSD, MacOS X)
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <time.h>

  7. #include <sys/types.h>
  8. #include <sys/socket.h>

  9. #include <netinet/in.h>
  10. #include <arpa/inet.h>
  11. #include <ifaddrs.h>

  12. int main(void)
  13. {
  14.         struct ifaddrs        *ifc, *ifc1;
  15.         char                ip[64];
  16.         char                nm[64];

  17.         if (0 != getifaddrs(&ifc)) return(-1);
  18.         ifc1 = ifc;

  19.         printf("Iface\tIP address\tNetmask\n");
  20.         for(; NULL != ifc; ifc = (*ifc).ifa_next) {
  21.                 printf("%s", (*ifc).ifa_name);
  22.                 if (NULL != (*ifc).ifa_addr) {
  23.                         inet_ntop(AF_INET, &(((struct sockaddr_in*)((*ifc).ifa_addr))->sin_addr), ip, 64);
  24.                         printf("\t%s", ip);
  25.                 } else {
  26.                         printf("\t\t");
  27.                 }
  28.                 if (NULL != (*ifc).ifa_netmask) {
  29.                         inet_ntop(AF_INET, &(((struct sockaddr_in*)((*ifc).ifa_netmask))->sin_addr), nm, 64);
  30.                         printf("\t%s", nm);
  31.                 } else {
  32.                         printf("\t\t");
  33.                 }
  34.                 printf("\n");
  35.         }

  36.         freeifaddrs(ifc1);
  37.         return(0);
  38. }
复制代码

[ 本帖最后由 mq110 于 2006-7-8 13:15 编辑 ]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2006-07-11 00:30 |只看该作者

  1. #include <stdio.h>
  2. extern int etext, edata, end;

  3. int main(void)
  4. {
  5.         printf("etext: \t%p\n", &etext);
  6.         printf("edata: \t%p\n", &edata);
  7.         printf("end: \t%p\n", &end);

  8.         return(0);
  9. }
复制代码


今天看到er的帖子,想起来了.做个标记.


又google到一篇文章

出处
http://linux.chinaitlab.com/kernel/37973.html


在链接过程中,链接器ld和ld86会使用变量记录下执行程序中每个段的逻辑地址。因此在程序中可以通过访问这几个外部变量来获得程序中段的位置。链接器预定义的外部变量通常至少有etext、_etext、edata、_edata、end和_end。
  
  变量名_etext和etext的地址是程序正文段结束后的第1个地址;_edata和edata的地址是初始化数据区后面的第1个地址;_end和end的地址是未初始化数据区(bss)后的第1个地址位置。带下划线'_'前缀的名称等同于不带下划线的对应名称,它们之间的唯一区别在于ANSI、POSIX等标准中没有定义符号etext、edata和end。
  
  当程序刚开始执行时,其brk所指位置与_end处于相同位置。但是系统调用sys_brk()、内存分配函数malloc()以及标准输入/输出等操作会改变这个位置。因此程序当前的brk位置需要使用sbrk()来取得。注意,这些变量名必须看作是地址。因此在访问它们时需要使用取地址前缀'&',例如&end等。例如:
  
  extern int _etext;
  int et;
  
  (int *) et = &_etext;     // 此时et含有正文段结束处后面的地址。
  
  下面程序predef.c可用于显示出这几个变量的地址。可以看出带与不带下划线'_'符号的地址值是相同的。
  
  /*
  Print the symbols predefined by linker.
  */
  extern int end, etext, edata;
  extern int _etext, _edata, _end;
  int main()
  {
  printf("&etext=%p, &edata=%p, &end=%p\n",
  &etext, &edata, &end);
  printf("&_etext=%p, &_edata=%p, &_end=%p\n",
  &_etext, &_edata, &_end);
  return 0;
  }
  
  在Linux 0.1X系统下运行该程序可以得到以下结果。请注意,这些地址都是程序地址空间中的逻辑地址,即从执行程序被加载到内存位置开始算起的地址。
  
  [/usr/root]# gcc -o predef predef.c
  [/usr/root]# ./predef
  &etext=4000, &edata=44c0, &end=48d8
  &_etext=4000, &_edata=44c0, &_end=48d8
  [/usr/root]#
  
  如果在现在的Linux系统(例如RedHat 9)中运行这个程序,就可得到以下结果。我们知道现在Linux系统中程序代码从其逻辑地址0x08048000处开始存放,因此可知这个程序的代码段长度是0x41b字节。
  
  [root@plinux]# ./predef
  &etext=0x804841b, &edata=0x80495a8, &end=0x80495ac
  &_etext=0x804841b, &_edata=0x80495a8, &_end=0x80495ac
  [root@plinux]#
  
  Linux 0.1x内核在初始化块设备高速缓冲区时(fs/buffer.c),就使用了变量名_end来获取内核映像文件Image在内存中的末端后的位置,并从这个位置起开始设置高速缓冲区。

论坛徽章:
0
5 [报告]
发表于 2006-07-14 10:15 |只看该作者
用cscope定位结构体等三步曲:
1.用绝对路径的好处是生成的cscope.out可以放在任意位置使用。

  1. find /usr/include /usr/pkg/include /usr/local/include -name "*.h" > cscope.files
复制代码

2.

  1. cscope -b
复制代码

3.在vim(要编译cscope功能)中使用

  1. :set cst "可放在~/.vimrc中
  2. :cs add cscope.out
复制代码

即可用ctrl+鼠标左键或ctrl+]来定位该结构体的定义之处。
由于ctrl+]默认按:cs find g word的功能,有些时候还需要用:cs find s word,可以

  1. nmap <C-[> :cs find s <C-R>=expand("<cword>")<CR><CR>
复制代码

论坛徽章:
0
6 [报告]
发表于 2006-08-05 22:59 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2006-08-07 21:22 |只看该作者
楼主见解很精辟!
我做硬件的,C语言学的很一般。也没有写过大程序。看内核的时候碰见下面的语句,
#define likely(x)       b_expect(!!(x), 1)
#define unlikely(x)     b_expect(!!(x), 0)
#define b_expect(x, expected_value) (x)
实在揣摩不透作者的用意,加上脑袋瓜不好使,很多东西都忘记了。所以就编了下面这个来测试:
#include <stdio.h>
#define likely(x)       b_expect(!!(x), 1)
#define unlikely(x)     b_expect(!!(x), 0)
#define b_expect(x, expected_value) (x)

void main(void)
{
int i,x;
for(i=0;;i++)
{
printf("Test likely,unlikely,Pls Input x:");
scanf("%d",&x);
printf("\n");
printf("likely(%d) is:%d\n",x,likely(x));
printf("unlikely(%d) is :%d\n",x,unlikely(x));
}
}
呵呵,一句话,我的程序都是测试出来的。

[ 本帖最后由 iolinux 于 2006-8-7 21:31 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2006-08-18 16:34 |只看该作者
I am doing some tests about  a  language。Before doing this project I did some programs and thought there is nothing in testing.Now I don't think so,to find one bug and solve this bug
you must do much investigation and know the theory.By way I can feel the skills of designing the language. Whatever you do you must pay your attention to the basics and spirits of objects.We must be patient and like to study,our major changes very quickly if you don't have such attitudes,you will be the next loser.

论坛徽章:
0
9 [报告]
发表于 2006-09-05 20:49 |只看该作者
觉得具体的语言都是比较虚的,特别是解释性的语言,几乎都是从编译型的发展来的。
如果有C/C++语言之类的基础,对于特定的语言学习不会很难。
学习一门新的语言,最重要的就是阅读别人写的代码。(当然最好是看成熟的代码)
还有就是了解程序的执行过程(不是main那种),而是上面提到的链接,上下文等。
这样才能提高的更快

论坛徽章:
0
10 [报告]
发表于 2006-10-10 15:27 |只看该作者
好的编程习惯也是提高软件质量的重要因素,还记得曾经为了找出 if (i = 1)这样的问题花了那么多的时间,如果早点看看《高质量C编程》就好了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP