SQLite一种轻量级关系
数据库,在嵌入式系统中使用比较广泛。
在iOS中使用SQLite需要添加库libsqlite3.0.dylib,并引入头文件#import <sqlite3.h>
FMDB对sqlit接口进行了高级封装,使用上更加友好简洁。
https://github.com/ccgus/fmdb
FMDB包含以下文件:
FMDatabase.h FMDatabase.m FMDatabaseAdditions.h FMDatabaseAdditions.m FMDatabasePool.h FMDatabasePool.m FMDatabaseQueue.h FMDatabaseQueue.m FMResultSet.h FMResultSet.m |
FMDB使用:
1.FMDatabase 非线程安全,不要在多线程中使用FMDatabase的单例
//用指定的数据库名实例化一个数据库,没有此文件则创建 FMDatabase *db = [FMDatabase databaseWithPath:filePath]; "" 在临时目录创建一个空的数据库,数据库关闭后会自动删除 NULL 在内存中创建一个空的数据库,数据库关闭后会自动删除 //打开数据库,资源不足或权限不够会打开失败 if (![db open]) { NSLog(@"数据库打开失败"); } //用完后需要关闭 [db close]; |
数据库操作:
查询操作:SELECT,返回FMResultSet,nil表示查询失败;
[db executeQuery:sql]; FMResultSet *rs = [db executeQuery:@"SELECT * FROM TableName"]; { while ([rs next]) { //获取查询结果,即使结果只有一条 } } |
更新操作:非SELECT操作都是更新操作,返回值类型BOOL,YES:成功,NO:失败
[db executeUpdate:sql];
数据库事务:
当需要插入的数据较多时,使用事务操作会比较快。
[db beginTransaction]; //需要执行的操作 [db commit]; FMResultSet *rs; FMResultSet可以不手动关闭,当数据库关闭时,会跟着关闭。 2.FMDatabaseQueue 线程安全,所有的数据库操作会在队列中顺序执行 [FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path]; queue inDatabase:^(FMDatabase *db) { // }]; queue inTransaction:^(FMDatabase *db, BOOL *rollback) { // } |
今天在ubuntu 12.04 LTS 上安装Matlab时总是出错,显示拷贝jar包(cp “xx.jar”)出现错误,在网上搜索了一下发现原来是没有安装
java。自己打算安装oracle官方的java版本,所以就进行了一下安装:(也可以使用软件源中的openjava)
1.删除openjava安装包:
sudo apt-get purge openjdk*
2.安装oracle java 7,打开终端运行下面的命令(这里是有错误的):
sudo add-apt-repository ppa:eugenesan/java //添加ppa源 sudo apt-get update //更新apt-cache sudo apt-get install oracle-java7-installer //安装java7的安装包 ------------------------------------------------------------------------------------- |
这里有时候会出现问题:
dpkg:处理 oracle-java7-installer (--configure)时出错:
子进程 已安装 post-installation 脚本 返回了错误号 1
在处理时有错误发生:
oracle-java7-installer
这里应该是ppa源的问题,更换ppa源之后问题解决了:
sudo rm /var/lib/dpkg/info/oracle-java7-installer* sudo apt-get purge oracle-java7-installer* sudo rm /etc/apt/sources.list.d/*java* sudo apt-get update sudo add-apt-repository ppa:webupd8team/java //使用新的ppa源 sudo apt-get update sudo apt-get install oracle-java7-installer -------------------------------------------------------------------------------------- |
安装成功后,在terminal输入:java -version 即可现实对应的版本号。
背景:
windows 7 64位
操作系统,安装
数据库:win64_11gR2_database_1of2、win64_11gR2_database_2of2,
客户端:win32_11gR2_client,plsql8.0(目前只有32位)
问题:plsql登录时报错:
Initialization error Could not initialize "C:\oracle\product\10.2.0\client_1\bin\oci.dll" Make sure you have the 32 bits Oracle Client installed. OCIDLL forced to C:\oracle\product\10.2.0\client_1\bin\oci.dll LoadLibrary(C:\oracle\product\10.2.0\client_1\bin\oci.dll) returned 0 |
度娘解决方法:
这是因为PLSQL developer 没有支持64位的版本(PLSQL developer 是delphi开发,而这个开发工具本身就没有64位的);
PLSQL Develpoer官方下载地址 :http://www.allroundautomations.com/plsqldev.html.解决方法如下:去下载Oracle的Instant Client ,官方下载地址 :http://www.oracle.com/technology/software/tech/oci/instantclient/htdocs/winsoft.html
下载完之后解压到一个路径下,然后进入PLSQL Developer 8中--工具 -- 首选项 -- 里边的 Oracle主目录 和OCI库中,分别写入 Oracle Instant Client解压后的路径信息,如下:
Oracle主目录:Instant Client解压后的目录 ....../instantclient_11_2。
OCI库:Oracle主目录中的oci.dll文件 ....../instantclient_11_2/oci.dll。
以上配置其实是相当于替换了一下Oracle的客户端,接下来我们还需要对系统的环境变量进行配置。
主要需要以下两项:
变量名:TNS_ADMIN.
变量值:Oracle安装目录中的 ....../product/11.2.0/dbhome_1/NETWORK/ADMIN.
变量名:NLS_LANG.
变量值:AMERICAN_AMERICA(数据库字符编码 ).
(另外以下是安装Oracle就需要配置的,否则可能会有TNS协议适配器错误)
变量名:oracle_sid
变量值:Oracle的数据库实例
其中数据库字符编码可以通过进入
SQL PLUS select userenv(‘language’) from dual;来查询。
这样重新启动一下PLSQL Developer,然后就能访问了。
概述
软件测试用例设计最重要的前提是掌握业务知识,加上一定的
测试用例设计方法,软件测试的
工作实际就非常简单了,多测试几个实际项目技能就自然提高了。
我把软件测试用例设计分成4个部分:
·测试类型
·设计思路
·设计技术
·去芜存菁
测试类型
测试类型有很多分类方法,为了编写文档方便,可以把各种分类方法合并,做为用例文档的目录。
明确测试类型可以避免重大漏测。
·文档测试:需求,设计,用户手册...
·界面测试:CLI, WEB, GUI, API
·协议一致性测试:与标准一致。
·
功能测试:以需求文档、命令/界面显示功能、用户手册为编写线索。
·组网测试:一些复杂网络协议适用。
·集成测试:多个模块或者整个系统叠加测试,测试各个功能之间的接口是否正常,是否相互影响。
·兼容测试:不同厂家产品,相关产品、不同版本协同工作。
·事件测试:修改配置,重启,断电等。
·稳定性测试:模拟线上环境,长期运行。
·可靠性测试:成熟,容错,易恢复。
·易用性测试:软件产品被理解、
学习、使用和吸引用户的能力。
·可维护性测试:易分析,易修改,易测试,易管理。
·可移植性测试:从一种环境迁移到另一种环境。
设计思路
发散思维和逆向思维是测试设计中最重要的两个思维。
具体运用参考:XXXX
设计技术
在上一步骤执行时或者执行后,都可以运行常见的设计技术:
·等价类划分
·边界值
·错误推测
·因果图
....
去芜存菁
足够好就行,精减用例,划分优先级。
·哪些功能是软件的特色?
·哪些功能是用户最常用的?
如果系统可以分块卖的话,哪些功能块在销售时最昂贵?
·哪些功能出错将导致用户不满或索赔?
·哪些程序是最复杂、最容易出错的?
·哪些程序是相对独立,应当提前测试的?
·哪些程序最容易扩散错误?
·哪些程序是全系统的性能瓶颈所在?
·哪些程序是开发者最没有信心的?
__CSVRead函数用于对脚本进行参数话,当脚本中不同变量需要不同参数值时,可以考虑__CSVRead函数。
以登录的用户名、密码为例:实际进行
压力测试时,需要模拟使用不同的用户并发访问系统,此时需要我们对脚本中的用户名、密码进行参数化;下面具体介绍如何使用csvread函数:
1. 准备好参数取值List清单,文件格式为:csv或者txt文件,里面保存变量要读取的参数值,每个变量间用逗号相隔。每行表示每一组参数值,每列表示同一种变量;
如准备10个不同的用户,文件名user parameter.txt,其用户名、密码取值如下:
test01@sina.com,12 test02@sina.com,12345678 test03@sina.com,hai123 test04@sina.com,12abc test05@sina.com,23dcs test06@sina.com,ed12q test07@sina.com,jumper test08@sina.com,poi2qwe test09@sina.com,122dewq test10@sina.com,123dew23 |
2.准备好参数取值List清单后,打开Jmeter的函数助手,选择csvread函数,生成函数; 在Jmeter“选项”中-->选择“函数助手对话框”-->选择csvread函数或者直接采用快捷键Ctrl+F打开,
其中:
CSV file to get values from | *alias:表示要读取的文件路径,应该是绝对路径(如:D:\Software\jmeter\User parameter.txt)
CSV文件列号| next| *alias:表示当前变量读取第几列数据,注意第一列是0
点击生成按钮,则生成了函数,如:${__CSVRead(D:\Software\jmeter\User parameter.txt,0)},表示是从D:\Software\jmeter\User parameter.txt文件中第一列读取数据。以此类推。
3.在Jmeter录制的脚本中,找到登录这块需要参数桦的用户名、密码,对用户名、密码的value值进行参数化,其中用户名的value值替换为${__CSVRead(D:\Software\jmeter\User parameter.txt,0)},密码的value值替换为${__CSVRead(D:\Software\jmeter\User parameter.txt,1)},保存当前脚本,参数化完毕,(注:如果要修改要读取的参数值,则可直接在txt清单中修改数字而不用重新在csvread函数生成中修改)
4.Jmeter执行的时候,如果有多个线程,顺序读取第一行的数字,如果线程组多于文件中的行数,则循环读取。
一、核心步骤
1.创建一个Java工程;
2.将
JMeter的lib目录下的jar文件添加进此工程的Build Path;
3.创建一个类并实现JavaSamplerClient接口或继承AbstractJavaSamplerClient,并重写:
public Arguments getDefaultParameters():设置可用参数及的默认值; public void setupTest(JavaSamplerContext arg0):每个线程测试前执行一次,做一些初始化 工作; public SampleResult runTest(JavaSamplerContext arg0):开始测试,从arg0参数可以获得参数值; public void teardownTest(JavaSamplerContext arg0):测试结束时调用; 4.Export为Runnable Jar File; |
5.将此jar包放入JMETER_HOME\lib\ext目录;
6.以管理员身份打开JMeter;
7.创建线程组、Java Request、结果树,进行测试;
二、实例
利用JMeter对服务进行
性能测试,服务为:将输入的两个参数通过IO存入文件;
1、编写Java代码
服务:
import java.io.File; import java.io.PrintWriter; public class OutputService { public static void output(String filename,int a, int b) throws Exception { PrintWriter out = new PrintWriter(new File(filename)); out.write(a+":"+b); out.close(); } } |
测试类:
package test; import org.apache.jmeter.config.Arguments; import org.apache.jmeter.protocol.java.sampler.JavaSamplerClient; import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext; import org.apache.jmeter.samplers.SampleResult; public class PerformenceTest implements JavaSamplerClient { private SampleResult results; private String a; private String b; private String filename; // 设置传入的参数,可以设置多个,已设置的参数会显示到Jmeter的参数列表中 public Arguments getDefaultParameters() { Arguments params = new Arguments(); params.addArgument("filename", "0");//设置参数,并赋予默认值0 params.addArgument("a", "0");//设置参数,并赋予默认值0 params.addArgument("b", "0");//设置参数,并赋予默认值0 return params; } // 初始化方法,实际运行时每个线程仅执行一次,在测试方法运行前执行 public void setupTest(JavaSamplerContext arg0) { results = new SampleResult(); } // 测试执行的循环体,根据线程数和循环次数的不同可执行多次 @Override public SampleResult runTest(JavaSamplerContext arg0) { b = arg0.getParameter("b"); // 获取在Jmeter中设置的参数值 a = arg0.getParameter("a"); // 获取在Jmeter中设置的参数值 filename = arg0.getParameter("filename"); // 获取在Jmeter中设置的参数值 results.sampleStart();// jmeter 开始统计响应时间标记 try { OutputService test = new OutputService(); test.output(filename,Integer.parseInt(a), Integer.parseInt(b)); results.setSuccessful(true); // 被测对象调用 } catch (Throwable e) { results.setSuccessful(false); e.printStackTrace(); } finally { results.sampleEnd();// jmeter 结束统计响应时间标记 } return results; } // 结束方法,实际运行时每个线程仅执行一次,在测试方法运行结束后执行 public void teardownTest(JavaSamplerContext arg0) { } public static void main(String[] args) { // TODO Auto-generated method stub Arguments params = new Arguments(); params.addArgument("a", "0");//设置参数,并赋予默认值0 params.addArgument("b", "0");//设置参数,并赋予默认值0 JavaSamplerContext arg0 = new JavaSamplerContext(params); PerformenceTest test = new PerformenceTest(); test.setupTest(arg0); test.runTest(arg0); test.teardownTest(arg0); } } Export 为 Runnable Jar File; |
2、设置JMeter
以管理员身份打开JMeter,并创建Java Request后,结构如下图所示:
在Java请求中发现了自己新建的测试类:
我们在JMeter中发现参数有三个:
我们在响应的数值中填入:
大家一定很奇怪,怎么会有一些看不懂的东西,这是JMeter提供的函数,我们可以在
因为我们要做的是性能测试,因此我们需要开多个线程并发测试,因此随机数很重要;
常用的函数为:
(1)_Random生成随机整数;
(2)_RandomString生成随机字符串;
在线程组中设置并发线程数为10000,保存后即可运行;
图形结果如下所示:
聚合报告:
表格查看结果:
结果成功,成功生成了接近10000个文件:
3.期间遇到的问题
3.1 Export为Jar File导致Java Request的类名称无法找到;
3.2 JMeter java.lang.OutOfMemoryError: PermGen space问题:
在JMeter.bat 中修改:
set HEAP=-Xms512m -Xmx1024m
set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m
set SURVIVOR=-XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=50%
set TENURING=-XX:MaxTenuringThreshold=2
set RMIGC=-Dsun.rmi.dgc.client.gcInterval=600000 -Dsun.rmi.dgc.server.gcInterval=600000
set PERM=-XX:PermSize=256m -XX:MaxPermSize=512m
3.3 JMeter需要以管理员身份打开,否则会出现:
相关文章:
针对
软件质量特性进行
测试,可以避免重大漏测,一般人我不告诉他。
《软件工程—产品质量》(GB/T 16260-2006)中规定对软件的每个质量特性与子特性都有定义:
一、功能性:是指当软件在指定条件下使用,软件产品满足明确和隐含要求功能的能力。
适合性:是指软件产品与指定的任务和用户目标提供一组合适的功能的能力。
准确性:是指软件产品具有所需精确度的正确或相符的结果及效果的能力。
互操作性:是指软件产品与一个或多个规定系统进行交互的能力。
保密安全性:是指软件产品保护信息和数据的能力,以使未授权的人员或系统不能阅读或修改这些信息和数据,但不拒绝授权人员或系统对其的访问。
功能依从性:是指软件产品依附与同功能性相关的标准、约定或法规以及类似规定的能力。
二、可靠性:在指定条件下使用时,软件产品维持规定的性能级别的能力。
成熟性:是指软件产品避免因软件中错误发生而导致失效的能力。
容错性:是指在软件发生故障或违反指定接口的情况下,软件产品维持规定的性能级别的能力。
易恢复性:是指在失效发生的情况下,软件产品重建规定的性能级别并恢复受直接影响的数据的能力。
可靠性依从性:是指软件产品依附与同可靠性相关的标准、约定或法规以及类似规定的能力。
三、易用性:是指在指定条件下使用时,软件产品被理解、学习、使用和吸引用户的能力。 易理解性:是指软件产品使用户能理解软件产品是否合适以及如何能将软件用于特定的任务和使用环境的能力。
易学性:是指软件产品使用户能学习它的能力。
易操作性:是指软件产品使用户能操作和控制它的能力。
吸引性:是指软件产品吸引用户的能力。
易用性依从性:是指软件产品依附与同易用性相关的标准、约定、风格指南或法规以及类似规定的能力。
四、效率:是指在规定条件下,相对于所用资源的数量,软件产品可提供适当的性能的能力。
时间特性:是指在规定条件下,软件产品执行其功能时,提供适当的响应时间和处理时间以及吞吐率的能力。
资源利用性:是指在规定条件下,软件产品执行其功能时,提供合适的数量和类型的资源的能力。
效率依从性:是指软件产品依附与同效率相关的标准或约定的能力。
五、维护性:是指软件产品可被修改的能力,修改可能包括修正,改进或软件适应环境、需求和功能规格说明中的变化。
易分析性:是指软件产品诊断软件中的缺陷或失效原因,以及判定待修改的部分的能力。
易改变性:是指软件产品使指定的修改可以被实现的能力。
稳定性:是指软件产品避免由于软件修改而造成意外结果的能力。
易测试性:是指软件产品使已修改软件能被确认的能力。
维护性依从性:是指软件产品依附与同维护性相关的标准或约定的能力。
六、可移植性:是指软件产品从一种环境迁移到另一种环境的能力。
适应性:是指软件产品无需采用有别于为考虑该软件的目的而准备的活动或手段,就可能适应不同的指定环境的能力。
易安装性:是指软件产品在指定环境中被安装的能力。
共存性:是指软件产品在公共环境中同与其分享公共资源的其他独立软件共存的能力。
易替换性:是指软件产品在环境相同、目的相同的情况下替代另一个指定软件产品的能力。
可移植性依从性:是指软件产品依附与同可移植性相关的标准或约定的能力。
CAS操作
CAS是单词compare and set的缩写,意思是指在set之前先比较该值有没有变化,只有在没变的情况下才对其赋值。
我们常常做这样的操作
if(a==b) {
a++;
}
试想一下如果在做a++之前a的值被改变了怎么办?a++还执行吗?出现该问题的原因是在多线程环境下,a的值处于一种不定的状态。采用锁可以解决此类问题,但CAS也可以解决,而且可以不加锁。
int expect = a; if(a.compareAndSet(expect,a+1)) { doSomeThing1(); } else { doSomeThing2(); } |
这样如果a的值被改变了a++就不会被执行。
按照上面的写法,a!=expect之后,a++就不会被执行,如果我们还是想执行a++操作怎么办,没关系,可以采用while循环
while(true) { int expect = a; if (a.compareAndSet(expect, a + 1)) { doSomeThing1(); return; } else { doSomeThing2(); } } |
采用上面的写法,在没有锁的情况下实现了a++操作,这实际上是一种非阻塞算法。
应用
java.util.concurrent.atomic包中几乎大部分类都采用了CAS操作,以AtomicInteger为例,看看它几个主要方法的实现:
public final int getAndSet(int newValue) { for (;;) { int current = get(); if (compareAndSet(current, newValue)) return current; } } |
getAndSet方法JDK文档中的解释是:以原子方式设置为给定值,并返回旧值。原子方式体现在何处,就体现在compareAndSet上,看看compareAndSet是如何实现的:
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
不出所料,它就是采用的Unsafe类的CAS操作完成的。
再来看看a++操作是如何实现的:
public final int getAndIncrement() { for (;;) { int current = get(); int next = current + 1; if (compareAndSet(current, next)) return current; } } |
几乎和最开始的实例一模一样,也是采用CAS操作来实现自增操作的。
++a操作和a++操作类似,只不过返回结果不同罢了
public final int incrementAndGet() { for (;;) { int current = get(); int next = current + 1; if (compareAndSet(current, next)) return next; } } |
此外,java.util.concurrent.ConcurrentLinkedQueue类全是采用的非阻塞算法,里面没有使用任何锁,全是基于CAS操作实现的。CAS操作可以说是JAVA并发框架的基础,整个框架的设计都是基于CAS操作的。
缺点:
1、ABA问题
CAS操作容易导致ABA问题,也就是在做a++之间,a可能被多个线程修改过了,只不过回到了最初的值,这时CAS会认为a的值没有变。a在外面逛了一圈回来,你能保证它没有做任何坏事,不能!!也许它讨闲,把b的值减了一下,把c的值加了一下等等,更有甚者如果a是一个对象,这个对象有可能是新创建出来的,a是一个引用呢情况又如何,所以这里面还是存在着很多问题的,解决ABA问题的方法有很多,可以考虑增加一个修改计数,只有修改计数不变的且a值不变的情况下才做a++,也可以考虑引入版本号,当版本号相同时才做a++操作等,这和事务原子性处理有点类似!
2、比较花费CPU资源,即使没有任何争用也会做一些无用功。
3、会增加程序测试的复杂度,稍不注意就会出现问题。
总结:
可以用CAS在无锁的情况下实现原子操作,但要明确应用场合,非常简单的操作且又不想引入锁可以考虑使用CAS操作,当想要非阻塞地完成某一操作也可以考虑CAS。不推荐在复杂操作中引入CAS,会使程序可读性变差,且难以测试,同时会出现ABA问题。
<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close"> <property name="driverClass" value=" oracle.jdbc.driver.OracleDriver" /> <!-- 相应驱动的jdbcUrl,你懂的 --> <property name="jdbcUrl" value="${jdbc_url}" /> <!-- 数据库的用户名 --> <property name="username" value="${jdbc_username}" /> <!-- 数据库的密码 --> <property name="password" value="${jdbc_password}" /> <!-- 检查数据库连接池中空闲连接的间隔时间,单位是分,默认值:240,如果要取消则设置为0 --> <property name="idleConnectionTestPeriodInMinutes" value="60" /> <!-- 连接池中未使用的链接最大存活时间,单位是分,默认值:60,如果要永远存活设置为0 --> <property name="idleMaxAgeInMinutes" value="10" /> <!-- 每个分区最大的连接数 --> <property name="maxConnectionsPerPartition" value="50" /> <!-- 每个分区最小的连接数 --> <property name="minConnectionsPerPartition" value="20" /> <!-- 分区数 ,默认值2,最小1,推荐3-4,视应用而定--> <property name="partitionCount" value="3" /> <!-- 每次去拿数据库连接的时候一次性要拿几个,默认值:2 --> <property name="acquireIncrement" value="2" /> <!-- 缓存prepared statements的大小,默认值:0 --> <property name="statementsCacheSize" value="4" /> <!-- 每个分区释放链接助理进程的数量,默认值:3,除非你的一个数据库连接的时间内做了很多 工作,不然过多的助理进程会影响你的性能 --> <property name="releaseHelperThreads" value="5" /> </bean> |
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="oracle.jdbc.OracleDriver"/> <property name="jdbcUrl" value="${jdbc_url}"/> <property name="user" value="${jdbc_username}" /> <property name="password" value="${jdbc_password}"/> <property name="acquireIncrement" value="5" /> <property name="acquireRetryAttempts" value="10"/> <property name="acquireRetryDelay" value="3000"/> <property name="autoCommitOnClose" value="true"/> <property name="breakAfterAcquireFailure" value="false"/> <property name="checkoutTimeout" value="10000"/> <property name="initialPoolSize" value="6"/> <property name="maxIdleTime" value="10000"/> <property name="maxPoolSize" value="10"/> <property name="minPoolSize" value="1"/> <property name="maxStatements" value="0"/> <property name="numHelperThreads" value="3"/> <property name="propertyCycle" value="600"/> <property name="maxStatementsPerConnection" value="0"/> </bean> |
用法:uname [选项]...
输出一组系统信息。如果不跟随选项,则视为只附加-s 选项。
-a, --all 以如下次序输出所有信息。其中若-p 和 -i 的探测结果不可知则被省略: -s, --kernel-name 输出内核名称 -n, --nodename 输出网络节点上的主机名 -r, --kernel-release 输出内核发行号 -v, --kernel-version 输出内核版本 -m, --machine 输出主机的硬件架构名称 -p, --processor 输出处理器类型或"unknown" -i, --hardware-platform 输出硬件平台或"unknown" -o, --operating-system 输出 操作系统名称 --help 显示此帮助信息并退出 --version 显示版本信息并退出 |
举例:
xyw@xyw-Eliot:~$ uname -a Linux xyw-Eliot 3.2.0-56-generic #86-Ubuntu SMP Wed Oct 23 09:20:45 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux xyw@xyw-Eliot:~$ uname -s Linux xyw@xyw-Eliot:~$ uname -n xyw-Eliot xyw@xyw-Eliot:~$ uname -r 3.2.0-56-generic xyw@xyw-Eliot:~$ uname -v #86-Ubuntu SMP Wed Oct 23 09:20:45 UTC 2013 xyw@xyw-Eliot:~$ uname -m x86_64 xyw@xyw-Eliot:~$ uname -p x86_64 xyw@xyw-Eliot:~$ uname -i x86_64 xyw@xyw-Eliot:~$ uname -o GNU/Linux |
这个命令可以看出操作系统是64位还是32位。