2015年1月7日
原文地址:http://www.cnblogs.com/qytan36/archive/2010/09/27/1836569.html
在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed)char与unsigned char之间的区别。
首先在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示的范围是-128~127,unsigned char没有符号位,因此能表示的范围是0~255,这个好理解,8个bit,最多256种情况,因此无论如何都能表示256个数字。
在实际使用过程中有什么区别呢?
主要是符号位,但是在普通的赋值,读写文件和网络字节流都没什么区别,反正就是一个字节,不管最高位是什么,最终读取结果都一样,只是你怎么理解最高位而已,在屏幕上面的显示可能不一样。
但是我们却发现在表示byte时,都用unsigned char,这是为什么呢?
首先我们通常意义上理解,byte没有什么符号位之说,更重要的是如果将byte的值赋给int,long等数据类型时,系统会做一些额外的工作。
如果是char,那么系统认为最高位是符号位,而int可能是16位或者32位,那么系统会对最高位做扩展(注意,赋给unsigned int也会做扩展),而如果是unsigned char,那么系统不会做扩展。
这就是二者的最大区别。
同理可以推导到其他的类型,比如short,unsigned short,等等。
具体可以通过下面的小例子看看其区别:
#include<stdio.h>
void f(unsigned char v)
{
char c = v;
unsigned char uc = v;
unsigned int a = c, b = uc;
int i = c, j = uc;
printf("------------------------\n");
printf("%%c: %c, %c\n", c, uc);
printf("%%X: %X, %X\n", c, uc);
printf("%%u: %u, %u\n", a, b);
printf("%%d: %d, %d\n", i, j);
}
int main(int argc, char *argv[])
{
f(0x80);
f(0x7F);
return 0;
}
输出结果:
------------------------
%c: €, €
%X: FFFFFF80, 80
%u: 4294967168, 128
%d: -128, 128
------------------------
%c: ,
%X: 7F, 7F
%u: 127, 127
%d: 127, 127
请按任意键继续. . .
由此可见,最高位若为0时,二者没有区别;若为非0时,则有区别了。
2010年6月13日
摘要: Linux系统下,需要大量的命令行选项,如果自己手动解析他们的话实在是有违软件复用的思想,不过还好,GNU C library留给我们一个解析命令行的接口(X/Open规范),好好使用它可以使你的程序改观不少。 使用getopt_long()需要引入头文件:#include<getopt.h> &nbs... 阅读全文
2010年5月26日
2010年1月4日
摘要: 最近在学习Linux下的C编程,买了一本叫《Linux环境下的C编程指南》读到makefile就越看越迷糊,可能是我的理解能不行。
于是google到了以下这篇文章。通俗易懂。然后把它贴出来,方便学习。
 ... 阅读全文
2010年1月3日
摘要: 代码覆盖率的测试工具 -- gcov
2009-03-25 09:47
简介在这章里,我们将会探讨gcov实用程序,并且了解一下如何使用gcov来帮助测试与支持软件配置与优化。我们将会了解如何使用gcov来构建软件,并且理解他所提供的各种数据类型。最后,我们将探讨当执行保险测试... 阅读全文
2009年3月5日
摘要: 写在前面的话:对于net-snmp我也是一个初学者,开始学习时也碰到了很多低级的问题。在很多论坛上(事实上比较少^_^, 建议大家直接去sourcefoge社区看关于net-snmp的mail-list),都没有比较初级入门的文章,本着开源学习的精神,把自己的一点收获,共享给大家。通过参考一些前辈的文章和帮助文档,本文实现了一个简单的mib,并编写了文档。本文主要面向初级学习者(我也是个... 阅读全文
今天做了snmp的测试,现把安装配置方法分享如下:
首先准备安装的源码包:net-snmp-5.4.2.1.tar.gz
1.解压源码包
tar xvf net-snmp****
2.创建安装目录
mkdir /usr/local/net-snmp
3.安装
./configure --prefix=/usr/local/net-snmp
make
make install
4.安装成功cp配置文件到/usr/local/net-snmp/share/snmp/目录下
cp ./EXZAPLE.conf /usr/local/net-snmp/share/snmp/snmpd.conf
5.修改配置文件
# sec.name source community
#com2sec local localhost COMMUNITY
#com2sec mynetwork NETWORK/24 COMMUNITY
com2sec local localhost COMMUNITY
com2sec mynetwork 192.168.1.186 public //为允许的源地址
com2sec mynetwork 192.168.1.254 public
com2sec mynetwork 192.168.1.0/24 public //为允许的源网络
6.编辑/etc/rc.local添加为自启动
添加下面一行:
/usr/local/net-snmp/sbin/snmpd -c /usr/local/net-snmp/share/snmp/snmpd.conf &
7.设置环境变量,编辑/etc/profile
在export前添加下面一行
PATH=/usr/local/net-snmp/bin:/usr/local/net-snmp/sbin:$PATH
8.测试命令
snmpget -v 1 -c "public" 192.168.1.236 .1.3.6.1.4.1.2021.10.1.3.1
注:要在同样安装过net-snmp的机器上测或在安装过第3方软件(solarwinds等)的机器测试
该命令的最后一个字段为cpu的OID
#########################################################################
问题补充:
上次装好netsnmp并观察了一段时间后发现获取内存,cpu信息等等都很正常,唯独磁盘信息与预期有点出入,我们预期获取磁盘所有分区的使用情况结果只获取了/根分区的使用情况:
经查证是配置文件snmpd.conf里的配置有关:
# disk checks
#
# The agent can check the amount of available disk space, and make
# sure it is above a set limit.
# disk PATH [MIN=DEFDISKMINIMUMSPACE]
#
# PATH: mount path to the disk in question.
# MIN: Disks with space below this value will have the Mib's errorFlag set.
# Default value = DEFDISKMINIMUMSPACE.
# Check the / partition and make sure it contains at least 10 megs.
disk / 10000
disk /home 10000
# % snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.2021.9
# enterprises.ucdavis.diskTable.dskEntry.diskIndex.1 = 0
# enterprises.ucdavis.diskTable.dskEntry.diskPath.1 = "/" Hex: 2F
# enterprises.ucdavis.diskTable.dskEntry.diskDevice.1 = "/dev/dsk/c201d6s0"
# enterprises.ucdavis.diskTable.dskEntry.diskMinimum.1 = 10000
# enterprises.ucdavis.diskTable.dskEntry.diskTotal.1 = 837130
# enterprises.ucdavis.diskTable.dskEntry.diskAvail.1 = 316325
# enterprises.ucdavis.diskTable.dskEntry.diskUsed.1 = 437092
# enterprises.ucdavis.diskTable.dskEntry.diskPercent.1 = 58
# enterprises.ucdavis.diskTable.dskEntry.diskErrorFlag.1 = 0
# enterprises.ucdavis.diskTable.dskEntry.diskErrorMsg.1 = ""
因为配置文件默认只有disk / 10000这一行;按此格式添加你期望获取的磁盘或分区;
it‘s ok!!问题解决;
验证cmd:
snmpwalk -v 1 -c "public" 218.108.231.183 .1.3.6.1.4.1.2021.9.1
snmpwalk -v 1 -c "public" 218.108.231.183 .1.3.6.1.4.1.2021.9.1.7
Installing /usr/share/man/man3/NetSNMP::agent.3pm
Installing /usr/share/man/man3/NetSNMP::OID.3pm
Installing /usr/share/man/man3/NetSNMP::agent::default_store.3pm
Installing /usr/share/man/man3/SNMP.3
Installing /usr/share/man/man3/NetSNMP::netsnmp_request_infoPtr.3pm
Installing /usr/share/man/man3/NetSNMP::default_store.3pm
Installing /usr/share/man/man3/NetSNMP::ASN.3pm
Installing /usr/share/man/man3/NetSNMP::TrapReceiver.3pm
Writing /usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi/auto/Bundle/NetSNMP/.packlist
Appending installation info to /usr/lib/perl5/5.8.5/i386-linux-thread-multi/perllocal.pod
make[1]: Leaving directory `/root/net-snmp-5.4.1/perl'
[root@cgeek ~]# rpm -vih elfutils-devel-0.96-1.i386.rpm
warning: elfutils-devel-0.96-1.i386.rpm: V3 DSA signature: NOKEY, key ID 4f2a6fd2
error: Failed dependencies:
elfutils-libelf-devel = 0.96-1 is needed by elfutils-devel-0.96-1.i386
[root@cgeek ~]# rpm -qa |grep elfutils
elfutils-libelf-0.96-1
elfutils-0.96-1
[root@cgeek ~]# rpm -vih elfutils-libelf-devel-0.96-1.i386.rpm
warning: elfutils-libelf-devel-0.96-1.i386.rpm: V3 DSA signature: NOKEY, key ID 4f2a6fd2
Preparing... ########################################### [100%]
1:elfutils-libelf-devel ########################################### [100%]
[root@cgeek ~]# rpm -vih elfutils-devel-0.96-1.i386.rpm
warning: elfutils-devel-0.96-1.i386.rpm: V3 DSA signature: NOKEY, key ID 4f2a6fd2
Preparing... ########################################### [100%]
1:elfutils-devel ########################################### [100%]
[root@cgeek ~]# /etc/rc.d/init.d/snmpd start
启动 snmpd: [ 确定 ]
http://blog.chinaunix.net/u2/62377/showart_490549.html
一.环境
OS:RHEL AS4
net-snmp version:5.3.2
二.步骤
1.用root帐户登录
2.运行snmpwalk和snmpget命令,看是否已经安装snmp,如果已经安装就没必要再安装了;-)
3.将net-snmp-5.3.2.tar.gz解压(tar -zxvf net-snmp-5.3.2.tar.gz)
4.进入net-snmp-5.3.2目录
5.运行./configure,根据提示输入相应信息
6.运行make
7.运行make install
8.安装完毕
三.可能遇到的问题
1.找不到libbeecrypt.la,在make时可能出现如下error
libtool: link: cannot find the library `/usr/lib/libbeecrypt.la' (librpmio.la: /usr/lib/libbeecrypt.la) make[1]: *** [snmpd] Error 1 make[1]: Leaving directory `/home/xxx/net-snmp-5.3.2/agent' make: *** [subdirs] Error 1 |
解决办法:
然后运行如下命令:
#tar -zxvf beecrypt-4.1.2.tar.gz
#./configure -prefix=/usr(默认是安装在/usr/local,我们需要安装在/usr目录下)
#make
#make install
2./usr/bin/ld: cannot find -lelf,在make时可能出现如下error
/usr/bin/ld: cannot find -lelf collect2: ld returned 1 exit status make[1]: *** [snmpd] Error 1 make[1]: Leaving directory `/home/xxx/net-snmp-5.3.2/agent' make: *** [subdirs] Error 1 |
解决办法:
#ln -s libelf.so.1 /usr/lib/libelf.so
3.我在安装的过程中没有碰到这个问题,在此作为参考
echo /usr/local/lib >/etc/ld.so.conf.d/libnetsnmp.conf
#/sbin/ldconfig -v
#make install