(1)pyhton shell下导入MySQLdb失败。
http://pypi.python.org/pypi/MySQL-python/#downloads
(2)下载解压MySQL-python。
http://pypi.python.org/packages/source/M/MySQL-python/MySQL-python-1.2.3.tar.gz#md5=215eddb6d853f6f4be5b4afc4154292f
(3)build时提示缺少setuptools。
root@192.168.1.104:~/software/python/MySQL-python-1.2.3# python setup.py
Traceback (most recent call last):
File "setup.py", line 5, in <module>
from setuptools import setup, Extension
ImportError: No module named setuptools
(4)下载安装setuptools。
http://pypi.python.org/pypi/setuptools#downloads 选自己Python对应的版本。
http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c11-py2.6.egg#md5=bfa92100bd772d5a213eedd356d64086
sh setuptools-0.6c11-py2.6.egg
root@192.168.1.104:~/software/python# python
Python 2.6.6 (r266:84292, Jun 18 2012, 14:10:23)
[GCC 4.4.6 20110731 (Red Hat 4.4.6-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import setuptools
上面没有报错说明安装成功了的。
(5)安装 mysql-devel 及其他必要的库
yum install mysql mysql-devel
(6)build mysqldb成功。
cd MySQL-python-1.2.3
/MySQL-python-1.2.3# python setup.py build
实践出现:
在包含自 _mysql.c:29 的文件中:
pymemcompat.h:10:20: 错误:Python.h:没有那个文件或目录
继续执行python setup.py install,可能出现以下错误:
======> pymemcompat.h:10:20: 致命错误:Python.h:没有那个文件或目录 编译中断。
出现这个问题的原因是,系统中的python是自带的,而没有安装python的开发包并没有安装,所以在shell下执行如下命令:
点击(此处)折叠或打开
yum install python-devel
Installed size: 454 k
Is this ok [y/N]: y
Installed:
python-devel.i686 0:2.6.6-29.el6_2.2 Complete!
再次:
python setup.py build
running build
running build_py
copying MySQLdb/release.py -> build/lib.linux-i686-2.6/MySQLdb
running build_ext
编辑 site.cfg ,把 mysql_config 那一行取消注释,并改为:
mysql_config = /usr/lib64/mysql/mysql_config
python setup.py build
python setup.py install
安装:python setup.py install
...
Finished processing dependencies for MySQL-python==1.2.3
安装结束后,
打开 python2.6 shell, 输入
import MySQLdb (注意:MySQLdb中的y是小写)
如果没够报错就说明安装成功了。
=================================================
示例程序:
首先,确定python-mysql是否已经安装了:
rpm包查看方法:
linux-Jack-nb4:/home/jackxiang/python # rpm -qa|grep python-mysql
python-mysql-1.2.0-17.2
说明系统已经有Python和mysql连接的包了。
如没有该包,需要通过rpm或者包来安装,可能较为麻烦,最好是在系统安装的时候就选择上该rpm包,这样做就很方便。
其次,上Python代码:
最后,运行脚本:
python python.py
({'Drop_priv': 'Y', 'Execute_priv': 'Y', 'Create_routine_priv': 'Y', 'Repl_client_priv': 'Y', 'Create_user_priv': 'Y', 'Create_priv': 'Y', 'References_priv': 'Y', 'max_user_connections': 0L, 'Shutdown_priv': 'Y', 'Grant_priv': 'Y', 'max_updates': 0L, 'max。。。。。
体会到Python很简单,很强大吧,呵呵
ython的memcache和json模块:
一般都是:python setup.py build
python setup.py install
Python的Memcache扩展:
ftp://ftp.tummy.com/pub/python-memcached/python-memcached-latest.tar.gz
/python-memcached-1.48# python setup.py build
python-memcached-1.48# python setup.py install
import memcache, import cjson。
http://pypi.python.org/pypi/MySQL-python/#downloads
(2)下载解压MySQL-python。
http://pypi.python.org/packages/source/M/MySQL-python/MySQL-python-1.2.3.tar.gz#md5=215eddb6d853f6f4be5b4afc4154292f
(3)build时提示缺少setuptools。
root@192.168.1.104:~/software/python/MySQL-python-1.2.3# python setup.py
Traceback (most recent call last):
File "setup.py", line 5, in <module>
from setuptools import setup, Extension
ImportError: No module named setuptools
(4)下载安装setuptools。
http://pypi.python.org/pypi/setuptools#downloads 选自己Python对应的版本。
http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c11-py2.6.egg#md5=bfa92100bd772d5a213eedd356d64086
sh setuptools-0.6c11-py2.6.egg
root@192.168.1.104:~/software/python# python
Python 2.6.6 (r266:84292, Jun 18 2012, 14:10:23)
[GCC 4.4.6 20110731 (Red Hat 4.4.6-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import setuptools
上面没有报错说明安装成功了的。
(5)安装 mysql-devel 及其他必要的库
yum install mysql mysql-devel
(6)build mysqldb成功。
cd MySQL-python-1.2.3
/MySQL-python-1.2.3# python setup.py build
实践出现:
在包含自 _mysql.c:29 的文件中:
pymemcompat.h:10:20: 错误:Python.h:没有那个文件或目录
继续执行python setup.py install,可能出现以下错误:
======> pymemcompat.h:10:20: 致命错误:Python.h:没有那个文件或目录 编译中断。
出现这个问题的原因是,系统中的python是自带的,而没有安装python的开发包并没有安装,所以在shell下执行如下命令:
点击(此处)折叠或打开
yum install python-devel
Installed size: 454 k
Is this ok [y/N]: y
Installed:
python-devel.i686 0:2.6.6-29.el6_2.2 Complete!
再次:
python setup.py build
running build
running build_py
copying MySQLdb/release.py -> build/lib.linux-i686-2.6/MySQLdb
running build_ext
编辑 site.cfg ,把 mysql_config 那一行取消注释,并改为:
mysql_config = /usr/lib64/mysql/mysql_config
python setup.py build
python setup.py install
安装:python setup.py install
...
Finished processing dependencies for MySQL-python==1.2.3
安装结束后,
打开 python2.6 shell, 输入
import MySQLdb (注意:MySQLdb中的y是小写)
如果没够报错就说明安装成功了。
=================================================
示例程序:
首先,确定python-mysql是否已经安装了:
rpm包查看方法:
linux-Jack-nb4:/home/jackxiang/python # rpm -qa|grep python-mysql
python-mysql-1.2.0-17.2
说明系统已经有Python和mysql连接的包了。
如没有该包,需要通过rpm或者包来安装,可能较为麻烦,最好是在系统安装的时候就选择上该rpm包,这样做就很方便。
其次,上Python代码:
import MySQLdb
import MySQLdb.cursors
db = MySQLdb.connect(host = 'localhost', user = 'root', passwd = '123456', db = 'mysql',cursorclass = MySQLdb.cursors.DictCursor)
cursor = db.cursor()
cursor.execute('select * from user')
rs = cursor.fetchall()
print rs
import MySQLdb.cursors
db = MySQLdb.connect(host = 'localhost', user = 'root', passwd = '123456', db = 'mysql',cursorclass = MySQLdb.cursors.DictCursor)
cursor = db.cursor()
cursor.execute('select * from user')
rs = cursor.fetchall()
print rs
最后,运行脚本:
python python.py
({'Drop_priv': 'Y', 'Execute_priv': 'Y', 'Create_routine_priv': 'Y', 'Repl_client_priv': 'Y', 'Create_user_priv': 'Y', 'Create_priv': 'Y', 'References_priv': 'Y', 'max_user_connections': 0L, 'Shutdown_priv': 'Y', 'Grant_priv': 'Y', 'max_updates': 0L, 'max。。。。。
体会到Python很简单,很强大吧,呵呵
ython的memcache和json模块:
一般都是:python setup.py build
python setup.py install
Python的Memcache扩展:
ftp://ftp.tummy.com/pub/python-memcached/python-memcached-latest.tar.gz
/python-memcached-1.48# python setup.py build
python-memcached-1.48# python setup.py install
import memcache, import cjson。
1.sort(分类)用法
sort命令选项很长,下面仅介绍各种选项。
sort命令的一般格式为:
sort -cmu -o output_file [other options] +pos1 +pos2 input_files
下面简要介绍一下sort的参数:
-c 测试文件是否已经分类。
-m 合并两个分类文件。
-u 删除所有复制行。
-o 存储s o r t结果的输出文件名。
其他选项有:
-b 使用域进行分类时,忽略第一个空格。
-n 指定分类是域上的数字分类。
-t 域分隔符;用非空格或t a b键分隔域。
-r 对分类次序或比较求逆。
+n n为域号。使用此域号开始分类。
n n为域号。在分类比较时忽略此域,一般与+n一起使用。
post1 传递到m,n。m为域号,n为开始分类字符数;例如4,6意即以第5域分类,从第7个字符开始。
保存输出
- o选项保存分类结果,然而也可以使用重定向方法保存。下面例子保存结果到results.out:
$sort video >results.out
2.例子说明
=========================================
下面是文件video的清单,包含了上个季度家电商场的租金情况。各域为:
(1)名称,(2)供货区代码,(3)本季度租金,(4)本年租金。
域分隔符为冒号,为此对此例需使用‘-t’选项。文件如下:
[root@Linuxsvr lab]# cat video
Boys in Company C :HK :192 :2192
Alien :HK :119 :1982
The Hill :KL :63 :2972
Aliens :HK :532 :4892
Star Wars :HK :301 :4102
A Few Good Men :KL :445 :5851
Toy Story :HK :239 :3972
=========================================
3.启动方式
缺省情况下,sort认为“一个空格”或“一系列空格”为“分隔符”。要加入其他方式分隔,使用-t(-t+分隔符)选项,如:
[root@Linuxsvr lab]# sort -t: video
A Few Good Men :KL :445 :5851
Alien :HK :119 :1982
Aliens :HK :532 :4892
Boys in Company C :HK :192 :2192
Star Wars :HK :301 :4102
The Hill :KL :63 :2972
Toy Story :HK :239 :3972
以“:”为分隔符,按照第一列排序
4.
先查看是否为域分隔设置了- t选项,如果设置了- t选项,则使用分隔符将记录分隔成 域0、域1、域2、域3等等;
如果未设置- t选项,用空格代替。
缺省时sort以每行第一个字符将整个行排序,也可以指定域号,这样就会按照指定的域优先进行排序,
如果指定的域有重复,会参考下一个域。
sort对域的参照方式:
关于sort的一个重要事实是它参照第一个域作为域0,域1是第二个域,等等。sort也可以使用整行作为分类依据。
=========================================
第一个域 第二个域 第三个域 第四个域
域0 域1 域2 域3
Boys in Company C :HK :192 :2192
Alien :HK :119 :1982
The Hill :KL :63 :2972
Aliens :HK :532 :4892
Star Wars :HK :301 :4102
A Few Good Men :KL :445 :5851
Toy Story :HK :239 :3972
=========================================
文件是否已分类
怎样分辨文件是否已分类?如果只有30行,看看就知道了,但如果是400行呢,使用sort -c查看sort文件是否按某种顺序分类。
[root@Linuxsvr lab]# sort -c video
sort: video:2: disorder: Alien :HK :119 :1982
结果显示未分类,现在将video分类,并存为2.video
[root@Linuxsvr lab]# sort -t: video >2.video
[root@Linuxsvr lab]# sort -c 2.video
[root@Linuxsvr lab]#
没有任何错误提示,返回提示符表明已分类。然而如果测试成功,返回一个信息行会更好。
5.
基本sort
最基本的sort方式为sort filename,按第一域进行分类(分类键0)。实际上读文件时sort操作将行中各域进行比较,
这里返回基于第一域sort的结果
[root@Linuxsvr lab]# sort -t: video
A Few Good Men :KL :445 :5851
Alien :HK :119 :1982
Aliens :HK :532 :4892
Boys in Company C :HK :192 :2192
Star Wars :HK :301 :4102
The Hill :KL :63 :2972
Toy Story :HK :239 :3972
sort分类求逆
如果要逆向sort结果,使用- r选项。在通读大的注册文件时,使用逆向sort很方便。下面是按域0分类的逆向结果。
[root@Linuxsvr lab]# sort -t: -r video
Toy Story :HK :239 :3972
The Hill :KL :63 :2972
Star Wars :HK :301 :4102
Boys in Company C :HK :192 :2192
Aliens :HK :532 :4892
Alien :HK :119 :1982
A Few Good Men :KL :445 :5851
按指定域分类
有时需要只按第2域(分类键1)分类。这里为重排 报文中“供应区代码”,使用t 1,意义为按分类键1分类。
下面的例子中,所有供应区代码按分类键1分类;
注意分类键2和3对应各域也被分类。因为第2域有重复,sort会再重复的情况下优先考虑下一个域的顺序。而且是按照第一个字符分类,并不是
按照整个数值大小分类63小于445,却被排到后面,因为第一个字符是6,大于4。
[root@Linuxsvr lab]# sort -t: +1 video
Alien :HK :119 :1982
Boys in Company C :HK :192 :2192
Toy Story :HK :239 :3972
Star Wars :HK :301 :4102
Aliens :HK :532 :4892
A Few Good Men :KL :445 :5851
The Hill :KL :63 :2972
数值域分类
依此类推,要按第三域(第二分类键)分类,使用t 2。但是因为这是数值域,即为数值分类,可以使用- n选项。下面例子为按季度租金分类命
令及结果:
[root@Linuxsvr lab]# sort -t: +2n video
The Hill :KL :63 :2972
Alien :HK :119 :1982
Boys in Company C :HK :192 :2192
Toy Story :HK :239 :3972
Star Wars :HK :301 :4102
A Few Good Men :KL :445 :5851
Aliens :HK :532 :4892
使用-n选项是按照数值大小进行排列的,不使用-n选项是按照数字位排列,先看最左边第一位大小,如果第一位相同再看第二位大小
如果不指定n,如下
[root@Linuxsvr lab]# sort -t: +2 video
Alien :HK :119 :1982
Boys in Company C :HK :192 :2192
Toy Story :HK :239 :3972
Star Wars :HK :301 :4102
A Few Good Men :KL :445 :5851
Aliens :HK :532 :4892
The Hill :KL :63 :2972
数值域倒序:
[root@Linuxsvr lab]# sort -t: +2nr video
Aliens :HK :532 :4892
A Few Good Men :KL :445 :5851
Star Wars :HK :301 :4102
Toy Story :HK :239 :3972
Boys in Company C :HK :192 :2192
Alien :HK :119 :1982
The Hill :KL :63 :2972
唯一性分类
有时,原文件中有重复行,这时可以使用- u选项进行唯一性(不重复)分类以去除重复行,下例中A l i e n有相同的两行。带重复行的文件
如下,其中A l i e n插入了两次:
[root@Linuxsvr lab]# cat video
Boys in Company C :HK :192 :2192
Alien :HK :119 :1982
The Hill :KL :63 :2972
Aliens :HK :532 :4892
Star Wars :HK :301 :4102
A Few Good Men :KL :445 :5851
Toy Story :HK :239 :3972
Aliens :HK :532 :4892
使用- u选项去除重复行,不必加其他选项, sort会自动处理。
[root@Linuxsvr lab]# sort -u video
A Few Good Men :KL :445 :5851
Alien :HK :119 :1982
Aliens :HK :532 :4892
Boys in Company C :HK :192 :2192
Star Wars :HK :301 :4102
The Hill :KL :63 :2972
Toy Story :HK :239 :3972
[root@Linuxsvr lab]# sort video
A Few Good Men :KL :445 :5851
Alien :HK :119 :1982
Aliens :HK :532 :4892
Aliens :HK :532 :4892
Boys in Company C :HK :192 :2192
Star Wars :HK :301 :4102
The Hill :KL :63 :2972
Toy Story :HK :239 :3972
使用k的其他sort方法
sort还有另外一些方法指定分类键。可以指定k选项,第1域(分类键)以1开始。不要与前面相混淆。其他选项也可以使用k,主要用于指定分
类域开始的字符数目。格式:
-k keydef
The keydef argument is a restricted sort key field definition. The format of this definition is:
[root@Linuxsvr lab]# sort -t: -k[field_start[type][,field_end[type]]] video
[root@Linuxsvr lab]# sort -t: -k2,2 -k1,1 video
Alien :HK :119 :1982
Aliens :HK :532 :4892
Aliens :HK :532 :4892
Boys in Company C :HK :192 :2192
Star Wars :HK :301 :4102
Toy Story :HK :239 :3972
A Few Good Men :KL :445 :5851
The Hill :KL :63 :2972
如果不指定结束域,分类将会按照后面的域以次排序。如果上面的例子不指定-k2,2后面结束域,结果如下:
[root@Linuxsvr lab]# sort -t: -k2 -k1,1 video
Alien :HK :119 :1982
Boys in Company C :HK :192 :2192
Toy Story :HK :239 :3972
Star Wars :HK :301 :4102
Aliens :HK :532 :4892
Aliens :HK :532 :4892
A Few Good Men :KL :445 :5851
The Hill :KL :63 :2972
上面的例子不会再以第一域排序,而是按照第二域排序,如果第二域有重复,优先考虑第三域,如果再有重复,考虑第四域,而不是第一域。
用k做分类键排序
可以指定分类键次序。再全部将结果反向排序,方法如下:
[root@Linuxsvr lab]# sort -t: -k2,2 -k1,1 -r video
The Hill :KL :63 :2972
A Few Good Men :KL :445 :5851
Toy Story :HK :239 :3972
Star Wars :HK :301 :4102
Boys in Company C :HK :192 :2192
Aliens :HK :532 :4892
Aliens :HK :532 :4892
Alien :HK :119 :1982
[root@Linuxsvr lab]# sort -t: -k2,2 -k1,1 video
Alien :HK :119 :1982
Aliens :HK :532 :4892
Aliens :HK :532 :4892
Boys in Company C :HK :192 :2192
Star Wars :HK :301 :4102
Toy Story :HK :239 :3972
A Few Good Men :KL :445 :5851
The Hill :KL :63 :2972
下面的例子把Aliens改为Bliens,先对第三域反向排序,重复的地方再按照第一域正向排。
[root@Linuxsvr lab]# sort -t: +2nr -k1,1 video
Aliens :HK :532 :4892
Bliens :HK :532 :4892
A Few Good Men :KL :445 :5851
Star Wars :HK :301 :4102
Toy Story :HK :239 :3972
Boys in Company C :HK :192 :2192
Alien :HK :119 :1982
The Hill :KL :63 :2972
下面例子是先对第三域 正向排,重复的地方再按照第一域反向排
[root@Linuxsvr lab]# sort -t: +2n -k1,1 -r video
The Hill :KL :63 :2972
Alien :HK :119 :1982
Boys in Company C :HK :192 :2192
Toy Story :HK :239 :3972
Star Wars :HK :301 :4102
A Few Good Men :KL :445 :5851
Bliens :HK :532 :4892
Aliens :HK :532 :4892
sort命令选项很长,下面仅介绍各种选项。
sort命令的一般格式为:
sort -cmu -o output_file [other options] +pos1 +pos2 input_files
下面简要介绍一下sort的参数:
-c 测试文件是否已经分类。
-m 合并两个分类文件。
-u 删除所有复制行。
-o 存储s o r t结果的输出文件名。
其他选项有:
-b 使用域进行分类时,忽略第一个空格。
-n 指定分类是域上的数字分类。
-t 域分隔符;用非空格或t a b键分隔域。
-r 对分类次序或比较求逆。
+n n为域号。使用此域号开始分类。
n n为域号。在分类比较时忽略此域,一般与+n一起使用。
post1 传递到m,n。m为域号,n为开始分类字符数;例如4,6意即以第5域分类,从第7个字符开始。
保存输出
- o选项保存分类结果,然而也可以使用重定向方法保存。下面例子保存结果到results.out:
$sort video >results.out
2.例子说明
=========================================
下面是文件video的清单,包含了上个季度家电商场的租金情况。各域为:
(1)名称,(2)供货区代码,(3)本季度租金,(4)本年租金。
域分隔符为冒号,为此对此例需使用‘-t’选项。文件如下:
[root@Linuxsvr lab]# cat video
Boys in Company C :HK :192 :2192
Alien :HK :119 :1982
The Hill :KL :63 :2972
Aliens :HK :532 :4892
Star Wars :HK :301 :4102
A Few Good Men :KL :445 :5851
Toy Story :HK :239 :3972
=========================================
3.启动方式
缺省情况下,sort认为“一个空格”或“一系列空格”为“分隔符”。要加入其他方式分隔,使用-t(-t+分隔符)选项,如:
[root@Linuxsvr lab]# sort -t: video
A Few Good Men :KL :445 :5851
Alien :HK :119 :1982
Aliens :HK :532 :4892
Boys in Company C :HK :192 :2192
Star Wars :HK :301 :4102
The Hill :KL :63 :2972
Toy Story :HK :239 :3972
以“:”为分隔符,按照第一列排序
4.
先查看是否为域分隔设置了- t选项,如果设置了- t选项,则使用分隔符将记录分隔成 域0、域1、域2、域3等等;
如果未设置- t选项,用空格代替。
缺省时sort以每行第一个字符将整个行排序,也可以指定域号,这样就会按照指定的域优先进行排序,
如果指定的域有重复,会参考下一个域。
sort对域的参照方式:
关于sort的一个重要事实是它参照第一个域作为域0,域1是第二个域,等等。sort也可以使用整行作为分类依据。
=========================================
第一个域 第二个域 第三个域 第四个域
域0 域1 域2 域3
Boys in Company C :HK :192 :2192
Alien :HK :119 :1982
The Hill :KL :63 :2972
Aliens :HK :532 :4892
Star Wars :HK :301 :4102
A Few Good Men :KL :445 :5851
Toy Story :HK :239 :3972
=========================================
文件是否已分类
怎样分辨文件是否已分类?如果只有30行,看看就知道了,但如果是400行呢,使用sort -c查看sort文件是否按某种顺序分类。
[root@Linuxsvr lab]# sort -c video
sort: video:2: disorder: Alien :HK :119 :1982
结果显示未分类,现在将video分类,并存为2.video
[root@Linuxsvr lab]# sort -t: video >2.video
[root@Linuxsvr lab]# sort -c 2.video
[root@Linuxsvr lab]#
没有任何错误提示,返回提示符表明已分类。然而如果测试成功,返回一个信息行会更好。
5.
基本sort
最基本的sort方式为sort filename,按第一域进行分类(分类键0)。实际上读文件时sort操作将行中各域进行比较,
这里返回基于第一域sort的结果
[root@Linuxsvr lab]# sort -t: video
A Few Good Men :KL :445 :5851
Alien :HK :119 :1982
Aliens :HK :532 :4892
Boys in Company C :HK :192 :2192
Star Wars :HK :301 :4102
The Hill :KL :63 :2972
Toy Story :HK :239 :3972
sort分类求逆
如果要逆向sort结果,使用- r选项。在通读大的注册文件时,使用逆向sort很方便。下面是按域0分类的逆向结果。
[root@Linuxsvr lab]# sort -t: -r video
Toy Story :HK :239 :3972
The Hill :KL :63 :2972
Star Wars :HK :301 :4102
Boys in Company C :HK :192 :2192
Aliens :HK :532 :4892
Alien :HK :119 :1982
A Few Good Men :KL :445 :5851
按指定域分类
有时需要只按第2域(分类键1)分类。这里为重排 报文中“供应区代码”,使用t 1,意义为按分类键1分类。
下面的例子中,所有供应区代码按分类键1分类;
注意分类键2和3对应各域也被分类。因为第2域有重复,sort会再重复的情况下优先考虑下一个域的顺序。而且是按照第一个字符分类,并不是
按照整个数值大小分类63小于445,却被排到后面,因为第一个字符是6,大于4。
[root@Linuxsvr lab]# sort -t: +1 video
Alien :HK :119 :1982
Boys in Company C :HK :192 :2192
Toy Story :HK :239 :3972
Star Wars :HK :301 :4102
Aliens :HK :532 :4892
A Few Good Men :KL :445 :5851
The Hill :KL :63 :2972
数值域分类
依此类推,要按第三域(第二分类键)分类,使用t 2。但是因为这是数值域,即为数值分类,可以使用- n选项。下面例子为按季度租金分类命
令及结果:
[root@Linuxsvr lab]# sort -t: +2n video
The Hill :KL :63 :2972
Alien :HK :119 :1982
Boys in Company C :HK :192 :2192
Toy Story :HK :239 :3972
Star Wars :HK :301 :4102
A Few Good Men :KL :445 :5851
Aliens :HK :532 :4892
使用-n选项是按照数值大小进行排列的,不使用-n选项是按照数字位排列,先看最左边第一位大小,如果第一位相同再看第二位大小
如果不指定n,如下
[root@Linuxsvr lab]# sort -t: +2 video
Alien :HK :119 :1982
Boys in Company C :HK :192 :2192
Toy Story :HK :239 :3972
Star Wars :HK :301 :4102
A Few Good Men :KL :445 :5851
Aliens :HK :532 :4892
The Hill :KL :63 :2972
数值域倒序:
[root@Linuxsvr lab]# sort -t: +2nr video
Aliens :HK :532 :4892
A Few Good Men :KL :445 :5851
Star Wars :HK :301 :4102
Toy Story :HK :239 :3972
Boys in Company C :HK :192 :2192
Alien :HK :119 :1982
The Hill :KL :63 :2972
唯一性分类
有时,原文件中有重复行,这时可以使用- u选项进行唯一性(不重复)分类以去除重复行,下例中A l i e n有相同的两行。带重复行的文件
如下,其中A l i e n插入了两次:
[root@Linuxsvr lab]# cat video
Boys in Company C :HK :192 :2192
Alien :HK :119 :1982
The Hill :KL :63 :2972
Aliens :HK :532 :4892
Star Wars :HK :301 :4102
A Few Good Men :KL :445 :5851
Toy Story :HK :239 :3972
Aliens :HK :532 :4892
使用- u选项去除重复行,不必加其他选项, sort会自动处理。
[root@Linuxsvr lab]# sort -u video
A Few Good Men :KL :445 :5851
Alien :HK :119 :1982
Aliens :HK :532 :4892
Boys in Company C :HK :192 :2192
Star Wars :HK :301 :4102
The Hill :KL :63 :2972
Toy Story :HK :239 :3972
[root@Linuxsvr lab]# sort video
A Few Good Men :KL :445 :5851
Alien :HK :119 :1982
Aliens :HK :532 :4892
Aliens :HK :532 :4892
Boys in Company C :HK :192 :2192
Star Wars :HK :301 :4102
The Hill :KL :63 :2972
Toy Story :HK :239 :3972
使用k的其他sort方法
sort还有另外一些方法指定分类键。可以指定k选项,第1域(分类键)以1开始。不要与前面相混淆。其他选项也可以使用k,主要用于指定分
类域开始的字符数目。格式:
-k keydef
The keydef argument is a restricted sort key field definition. The format of this definition is:
[root@Linuxsvr lab]# sort -t: -k[field_start[type][,field_end[type]]] video
[root@Linuxsvr lab]# sort -t: -k2,2 -k1,1 video
Alien :HK :119 :1982
Aliens :HK :532 :4892
Aliens :HK :532 :4892
Boys in Company C :HK :192 :2192
Star Wars :HK :301 :4102
Toy Story :HK :239 :3972
A Few Good Men :KL :445 :5851
The Hill :KL :63 :2972
如果不指定结束域,分类将会按照后面的域以次排序。如果上面的例子不指定-k2,2后面结束域,结果如下:
[root@Linuxsvr lab]# sort -t: -k2 -k1,1 video
Alien :HK :119 :1982
Boys in Company C :HK :192 :2192
Toy Story :HK :239 :3972
Star Wars :HK :301 :4102
Aliens :HK :532 :4892
Aliens :HK :532 :4892
A Few Good Men :KL :445 :5851
The Hill :KL :63 :2972
上面的例子不会再以第一域排序,而是按照第二域排序,如果第二域有重复,优先考虑第三域,如果再有重复,考虑第四域,而不是第一域。
用k做分类键排序
可以指定分类键次序。再全部将结果反向排序,方法如下:
[root@Linuxsvr lab]# sort -t: -k2,2 -k1,1 -r video
The Hill :KL :63 :2972
A Few Good Men :KL :445 :5851
Toy Story :HK :239 :3972
Star Wars :HK :301 :4102
Boys in Company C :HK :192 :2192
Aliens :HK :532 :4892
Aliens :HK :532 :4892
Alien :HK :119 :1982
[root@Linuxsvr lab]# sort -t: -k2,2 -k1,1 video
Alien :HK :119 :1982
Aliens :HK :532 :4892
Aliens :HK :532 :4892
Boys in Company C :HK :192 :2192
Star Wars :HK :301 :4102
Toy Story :HK :239 :3972
A Few Good Men :KL :445 :5851
The Hill :KL :63 :2972
下面的例子把Aliens改为Bliens,先对第三域反向排序,重复的地方再按照第一域正向排。
[root@Linuxsvr lab]# sort -t: +2nr -k1,1 video
Aliens :HK :532 :4892
Bliens :HK :532 :4892
A Few Good Men :KL :445 :5851
Star Wars :HK :301 :4102
Toy Story :HK :239 :3972
Boys in Company C :HK :192 :2192
Alien :HK :119 :1982
The Hill :KL :63 :2972
下面例子是先对第三域 正向排,重复的地方再按照第一域反向排
[root@Linuxsvr lab]# sort -t: +2n -k1,1 -r video
The Hill :KL :63 :2972
Alien :HK :119 :1982
Boys in Company C :HK :192 :2192
Toy Story :HK :239 :3972
Star Wars :HK :301 :4102
A Few Good Men :KL :445 :5851
Bliens :HK :532 :4892
Aliens :HK :532 :4892
忍受不了windows的nslookup,连打这个命令都很陌生~
还是linux的dig好用,也习惯点。
下载dig for windows的版本
https://downloads.isc.org/isc/bind9/9.16.30/BIND9.16.30.x64.zip [下载时间:2023/12/21 10:36]
http://members.shaw.ca/nicholas.fong/dig/dig-files3.zip
ftp://ftp.isc.org/isc/bind9/9.17.18/bind-9.17.18.tar.xz
在D盘创建一个新文件夹dig,然后解压到里面!
来源:http://baiqiuyi.com/windows/dig-for-windows.html
还是linux的dig好用,也习惯点。
下载dig for windows的版本
https://downloads.isc.org/isc/bind9/9.16.30/BIND9.16.30.x64.zip [下载时间:2023/12/21 10:36]
http://members.shaw.ca/nicholas.fong/dig/dig-files3.zip
ftp://ftp.isc.org/isc/bind9/9.17.18/bind-9.17.18.tar.xz
在D盘创建一个新文件夹dig,然后解压到里面!
cd /d D:\dig
检测文件的完整性
D:\dig>sha1sum *
489a8ca7c7851088ade58c404ddde1a926559003 cygwin1.dll
57487baeaa0eb2848557b7ca54ed9183eafc73fa dig.exe
97dbd755d67a5829c138a4708be7a4f26ed0894c host.exe
d22e4b8956e1831ff0f9d07620ec19bf171f0c29 libbind9.dll
81588f0be7d3c6b320edc314532d9f2d0a105594 libdns.dll
e0bd7187bbc01003abfe7472e64b68cd1bdb6bab libeay32.dll
f445362e728a902796ec6871a79c6307054974e4 libisc.dll
b3255c0e4808a703f95c217a91ffcd6940e680c9 libisccfg.dll
dfbde4f9e25fd49a0846e97fd813d6876dc94067 liblwres.dll
61b8f573db448ae6351ae3475c2e7c482d81533c msvcr70.dll
da39a3ee5e6b4b0d3255bfef95601890afd80709 resolv.conf
4a578ecd09a2d0c8431bdd8cf3d5c5f3ddcddfc9 sha1sum.exe
9d9ec0e2cf59e14d9db618d10b55b881bb7d195b whois.exe
我的电脑,右键属性,高级,系统变量
修改
变量名:PATH
变量值:c:\windows\system32;d:\dig
#system32后面的分号不能有空格!
测试:
C:\Documents and Settings\Administrator>dig google.com
; <<>> DiG 9.3.2 <<>> google.com
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 797
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;google.com. IN A
;; ANSWER SECTION:
google.com. 300 IN A 66.249.89.99
google.com. 300 IN A 66.249.89.104
;; Query time: 109 msec
;; SERVER: 8.8.4.4#53(8.8.4.4)
;; WHEN: Thu Sep 16 23:31:02 2010
;; MSG SIZE rcvd: 60
检测文件的完整性
D:\dig>sha1sum *
489a8ca7c7851088ade58c404ddde1a926559003 cygwin1.dll
57487baeaa0eb2848557b7ca54ed9183eafc73fa dig.exe
97dbd755d67a5829c138a4708be7a4f26ed0894c host.exe
d22e4b8956e1831ff0f9d07620ec19bf171f0c29 libbind9.dll
81588f0be7d3c6b320edc314532d9f2d0a105594 libdns.dll
e0bd7187bbc01003abfe7472e64b68cd1bdb6bab libeay32.dll
f445362e728a902796ec6871a79c6307054974e4 libisc.dll
b3255c0e4808a703f95c217a91ffcd6940e680c9 libisccfg.dll
dfbde4f9e25fd49a0846e97fd813d6876dc94067 liblwres.dll
61b8f573db448ae6351ae3475c2e7c482d81533c msvcr70.dll
da39a3ee5e6b4b0d3255bfef95601890afd80709 resolv.conf
4a578ecd09a2d0c8431bdd8cf3d5c5f3ddcddfc9 sha1sum.exe
9d9ec0e2cf59e14d9db618d10b55b881bb7d195b whois.exe
我的电脑,右键属性,高级,系统变量
修改
变量名:PATH
变量值:c:\windows\system32;d:\dig
#system32后面的分号不能有空格!
测试:
C:\Documents and Settings\Administrator>dig google.com
; <<>> DiG 9.3.2 <<>> google.com
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 797
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;google.com. IN A
;; ANSWER SECTION:
google.com. 300 IN A 66.249.89.99
google.com. 300 IN A 66.249.89.104
;; Query time: 109 msec
;; SERVER: 8.8.4.4#53(8.8.4.4)
;; WHEN: Thu Sep 16 23:31:02 2010
;; MSG SIZE rcvd: 60
来源:http://baiqiuyi.com/windows/dig-for-windows.html
php有两套使用共享内存的函数,一套是System V IPC函数的封装,另一套是shmop。这两个都无需安装外部库文件。前者只能在linux下使用,而且要使用它的话,在安装php的时候要加上 –enable-sysvshm选项;而后者在linux和windows(win2k之后的系统,win98不支持)都可以使用,但在windows的时候,只有在php是ISAPI运行模式才能正常工作,在安装php的时候要加上–enable-shmop。
这两套函数的使用相当简单,下面分别给出简单的用法,更详细的信息可以参考php手册。
一、System V的共享内存使用:
—— Shared Memory Segments ——–
key shmid owner perms bytes nattch status
0×00003039 262144 daemon 666 100 0
注:0×00003039就是12345的16进制形式。
访问新创建的共享内存并删除这个共享内存的PHP代码:
二、shmop的共享内存使用:
来源:http://code.haohailuo.com/article-78.html
A.ipcs -m 查看共享内存
B.ipcrm –M 0x20110302//清这个内存地址的缓存
C.ipcrm -M 0x20110303//清这个内存地址的缓存
这两套函数的使用相当简单,下面分别给出简单的用法,更详细的信息可以参考php手册。
一、System V的共享内存使用:
<?php
// 创建内存块
$key = 12345; // 共享内存的key,注:类型为int
$memsize = 100; // 共享内存的大小,单位byte
$perm = 0666; // 共享内存访问权限,参考linux的权限
$var_key = 345; // 共享内存的某变量的key,注:类型为int
$shmid = shm_attach( $key, $memsize, $perm ); // 创建一个共享内存
shm_put_var( $shmid, $var_key, "abc" ); // 插入一个共享内存变量,key为$var_key,值为"abc"
shm_detach( $shmid ); // 关闭共享内存
?>
运行上面的php程序可以创建一个key为12345的共享内存,大小为100字节,里面有个值为“abc”的变量。在linux命令行敲入ipcs可以看到创建的共享内存信息:// 创建内存块
$key = 12345; // 共享内存的key,注:类型为int
$memsize = 100; // 共享内存的大小,单位byte
$perm = 0666; // 共享内存访问权限,参考linux的权限
$var_key = 345; // 共享内存的某变量的key,注:类型为int
$shmid = shm_attach( $key, $memsize, $perm ); // 创建一个共享内存
shm_put_var( $shmid, $var_key, "abc" ); // 插入一个共享内存变量,key为$var_key,值为"abc"
shm_detach( $shmid ); // 关闭共享内存
?>
—— Shared Memory Segments ——–
key shmid owner perms bytes nattch status
0×00003039 262144 daemon 666 100 0
注:0×00003039就是12345的16进制形式。
访问新创建的共享内存并删除这个共享内存的PHP代码:
<?php
// 读取内存块内容
$shmid = shm_attach( 12345 ); // 访问key为12345的共享内存
echo shm_get_var( $shmid, 345 ); // 把共享内存中key为345的变量打印出来,这里将显示abc
shm_remove( $shmid ); // 删除该共享内存
?>
运行上面这个php代码,将显示abc,并把共享内存删除,这时候再运行ipcs就可以看到那块共享内存已经不存在了。// 读取内存块内容
$shmid = shm_attach( 12345 ); // 访问key为12345的共享内存
echo shm_get_var( $shmid, 345 ); // 把共享内存中key为345的变量打印出来,这里将显示abc
shm_remove( $shmid ); // 删除该共享内存
?>
二、shmop的共享内存使用:
<?php
// 创建内存块
$key = 12345; // 共享内存的key
$memsize = 100; // 共享内存的大小,单位byte
$perm = 0666; // 共享内存访问权限,参考linux的权限
$offset = 0; // 共享内存偏移地址,0表示共享内存的起始地址
$shmid = shmop_open($key, "c", $perm, $memsize); // 创建一个共享内存,第二个参数c表示创建
$shm_bytes_written = shmop_write($shm_id, "abc", 0); // 把"abc"写入共享内存
echo $shm_bytes_written; // 打印出写入共享内存的数据长度,这里将显示3
shmop_close($shm_id); // 关闭共享内存
?>
运行这个php将创建一个key为12345,大小为100字节的共享内存,里面写入了”abc”这个字符串。我们在写一个访问这个共享内存的php:// 创建内存块
$key = 12345; // 共享内存的key
$memsize = 100; // 共享内存的大小,单位byte
$perm = 0666; // 共享内存访问权限,参考linux的权限
$offset = 0; // 共享内存偏移地址,0表示共享内存的起始地址
$shmid = shmop_open($key, "c", $perm, $memsize); // 创建一个共享内存,第二个参数c表示创建
$shm_bytes_written = shmop_write($shm_id, "abc", 0); // 把"abc"写入共享内存
echo $shm_bytes_written; // 打印出写入共享内存的数据长度,这里将显示3
shmop_close($shm_id); // 关闭共享内存
?>
<?php
// 读取内存块
$shm_id = shmop_open(12345, "w", 0, 0); // 打开key为12345的共享内存,第二个参数w表示以读写方式打开,打开已存在的共享内存,第三个和第四个参数必须是0
$shm_data = shmop_read($shm_id, 0, 3); // 从共享内存里面读取3字节的数据,第二个参数是偏移地址,0表示共享内存的起始地址
echo $shm_data; // 打印出上个函数返回的共享内存数据
shmop_delete($shm_id); // 删除共享内存
?>
// 读取内存块
$shm_id = shmop_open(12345, "w", 0, 0); // 打开key为12345的共享内存,第二个参数w表示以读写方式打开,打开已存在的共享内存,第三个和第四个参数必须是0
$shm_data = shmop_read($shm_id, 0, 3); // 从共享内存里面读取3字节的数据,第二个参数是偏移地址,0表示共享内存的起始地址
echo $shm_data; // 打印出上个函数返回的共享内存数据
shmop_delete($shm_id); // 删除共享内存
?>
来源:http://code.haohailuo.com/article-78.html
A.ipcs -m 查看共享内存
B.ipcrm –M 0x20110302//清这个内存地址的缓存
C.ipcrm -M 0x20110303//清这个内存地址的缓存
为了别人防止引用自己系统上的东西,可以采用一个防盗链接口,每个文件读取之前都要连接这个接口。很简单,就是判断请求页面和服务器上的地址是不是一致性。
来源:http://code.haohailuo.com/article-327.html
$referer = $_SERVER['HTTP_REFERER'];
$selfurl = $_SERVER['HTTP_HOST'];
if(false == strpos($referer,$selfurl))
{
echo '非法盗链!';
exit(1);
}
以上提供的只是一种方法。你可以用apache rewrite功能去重写URL,这样也可以做到一个防盗链。具体方法自己可以在百度上搜一下,在这里就不细谈了...$selfurl = $_SERVER['HTTP_HOST'];
if(false == strpos($referer,$selfurl))
{
echo '非法盗链!';
exit(1);
}
来源:http://code.haohailuo.com/article-327.html
1.首页点击链接
<html>
<head>
</head>
<body>
<a href="test.php">测试</a>
</body>
</html>
2.链接页,首先记录下上页的URL 赋值给一个变量,利用header来跳转,自动跳转哦,其实你可以做很多动作,我只是说下思路
为什么不用JS做,因为有的用户不记录历史,那么用JS的话,后退可能导致访问的页面到期的提示,原因也就是在这里了
来源地址:http://code.haohailuo.com/article-343.html
<html>
<head>
</head>
<body>
<a href="test.php">测试</a>
</body>
</html>
2.链接页,首先记录下上页的URL 赋值给一个变量,利用header来跳转,自动跳转哦,其实你可以做很多动作,我只是说下思路
为什么不用JS做,因为有的用户不记录历史,那么用JS的话,后退可能导致访问的页面到期的提示,原因也就是在这里了
<?php
$now_url = $_SERVER[HTTP_REFERER] //记录来访URL
header('location:'.$now); //跳转回去
?>
$now_url = $_SERVER[HTTP_REFERER] //记录来访URL
header('location:'.$now); //跳转回去
?>
来源地址:http://code.haohailuo.com/article-343.html
在PHP调用存储过程返回结果集的时候,会提示:can't return a result set in the given context;解决can't return a result set in the given context的方法。
来源:http://code.haohailuo.com/article-325.html
<?php
define('CLIENT_MULTI_RESULTS', 131072);
$link = mysql_connect("127.0.0.1", "root", "123",1,CLIENT_MULTI_RESULTS) or die("Could not connect: ".mysql_error());
mysql_select_db("test") or die("Could not select database");
$sql = "create procedure select_data()
begin
select * from user;
end;";
mysql_query($sql);
$result = mysql_query("call test.select_data()") or die("Query failed:" .mysql_error());
while($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
$line = '<tr><td><a target = _blank href=\''.$row["name"].'\'>'.$row["name"].'('.$row["pwd"].')'.'</a></td></t
r>';
echo $line;
printf("\n");
}
?>
define('CLIENT_MULTI_RESULTS', 131072);
$link = mysql_connect("127.0.0.1", "root", "123",1,CLIENT_MULTI_RESULTS) or die("Could not connect: ".mysql_error());
mysql_select_db("test") or die("Could not select database");
$sql = "create procedure select_data()
begin
select * from user;
end;";
mysql_query($sql);
$result = mysql_query("call test.select_data()") or die("Query failed:" .mysql_error());
while($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
$line = '<tr><td><a target = _blank href=\''.$row["name"].'\'>'.$row["name"].'('.$row["pwd"].')'.'</a></td></t
r>';
echo $line;
printf("\n");
}
?>
来源:http://code.haohailuo.com/article-325.html
随着MySQL 5.5版本的发布,Oracle开始推销这个开源数据库的Web应用程序职能了,而它的Oracle数据库则主要面向企业级的应用程序。
Oracle产品营销部门的高级经理Monica Kumar说:“我们发现对于不同应用场景来说,它们是截然不同。”
在星期三,该公司发布了开源的MySQL数据库的5.5版本,这是Oracle在一月收购Sun Microsystems,获得MySQL以后,第一次升级这个软件。现在Oracle掌控着关系数据库系统的两大应用领域,它必须要明确地区分出,在企 业中,哪个产品应该部署到哪里。
Kumar说:“对于基于Web的应用程序,定制的部门级应用程序和嵌入式应用程序来说,MySQL是一个比较适合的数据库。Oracle数据库是 企业级数据库领域的佼佼者,主要面向高端的应用程序:企业资源规划,客户关系管理,在线事务处理,大型的数据仓库和商务智能化应用程序。”
Kumar说:“这两个产品是彼此互补的关系,适用于不同的应用场景。”
Kumar说,这并不是说你不可以在Web应用程序中使用Oracle数据库,但是从历史角度来看,MySQL在Web方面使用的更广泛一些。她提 到了MySQL是LAMP(Linux-Apache-MySQL-PHP/Python/Perl)架构的一部分,在部署Web站点或Web应用程序的 时候,这是一个被广泛使用的架构。她说:“在基于Web的应用程序领域,它十分成功。”
MySQL工程部门的副总裁Tomas Ulin说,在Web领域,选择MySQL而不是Oracle的另外一个考虑是人员。在许多情况下,比起Oracle数据库来,一个 LAMP(Linux-Apache-MySQL-PHP/Python/Perl)管理员更熟悉MySQL。他说:“单从真正的开发者都使用MySQL 这一点就可以看出,MySQL是更加容易使用的。”
除了常规的Bug修复和一般性的调整以外,这个软件新发布的MySQL 5.5版本还提供了很多有意义的特性和功能。在这些特性和功能中,最重要的是更好的可扩展性和经过改进的复制(replication)功能。
在性能方面,这个软件在处理大量的并发连接的时候不再像它过去的版本那样慢到极点了。对于可以一次可以承受1000个连接的Web服务器来说,这是 一个令人欢欣鼓舞的改进。当增加大量的服务器核心(超过4个)的时候,这个软件可以获得附加的性能提升,过去的版本是无法做到这一点的。
常规的性能也得到了提高。Oracle表示,按照内部的标准,在Linux上,MySQL 5.5的读写速度比5.1版本提升了360%。在Windows Server机器上,这方面性能的提升超过了1500%。Ulin说:“MySQL 5.5版本的吞吐量更高。”
在复制(replication)方面,这个软件现在支持半同步(semi-synchronous)的复制(replication)了。过去的版本只支持异步的复制,这意味着有新的数据录入原始数据库的时候,数据库的备份拷贝不能马上得到更新。
Ulin说:“如果你在主服务器那边提交了一些东西,你无法确定从服务器何时才能获得这些更新。”使用半同步(semi-synchronous) 的复制(replication),在数据拷贝到备份数据库中以前,正在对数据库提交数据的应用程序都不会收到数据已经录入的确认信息。
Oracle产品营销部门的高级经理Monica Kumar说:“我们发现对于不同应用场景来说,它们是截然不同。”
在星期三,该公司发布了开源的MySQL数据库的5.5版本,这是Oracle在一月收购Sun Microsystems,获得MySQL以后,第一次升级这个软件。现在Oracle掌控着关系数据库系统的两大应用领域,它必须要明确地区分出,在企 业中,哪个产品应该部署到哪里。
Kumar说:“对于基于Web的应用程序,定制的部门级应用程序和嵌入式应用程序来说,MySQL是一个比较适合的数据库。Oracle数据库是 企业级数据库领域的佼佼者,主要面向高端的应用程序:企业资源规划,客户关系管理,在线事务处理,大型的数据仓库和商务智能化应用程序。”
Kumar说:“这两个产品是彼此互补的关系,适用于不同的应用场景。”
Kumar说,这并不是说你不可以在Web应用程序中使用Oracle数据库,但是从历史角度来看,MySQL在Web方面使用的更广泛一些。她提 到了MySQL是LAMP(Linux-Apache-MySQL-PHP/Python/Perl)架构的一部分,在部署Web站点或Web应用程序的 时候,这是一个被广泛使用的架构。她说:“在基于Web的应用程序领域,它十分成功。”
MySQL工程部门的副总裁Tomas Ulin说,在Web领域,选择MySQL而不是Oracle的另外一个考虑是人员。在许多情况下,比起Oracle数据库来,一个 LAMP(Linux-Apache-MySQL-PHP/Python/Perl)管理员更熟悉MySQL。他说:“单从真正的开发者都使用MySQL 这一点就可以看出,MySQL是更加容易使用的。”
除了常规的Bug修复和一般性的调整以外,这个软件新发布的MySQL 5.5版本还提供了很多有意义的特性和功能。在这些特性和功能中,最重要的是更好的可扩展性和经过改进的复制(replication)功能。
在性能方面,这个软件在处理大量的并发连接的时候不再像它过去的版本那样慢到极点了。对于可以一次可以承受1000个连接的Web服务器来说,这是 一个令人欢欣鼓舞的改进。当增加大量的服务器核心(超过4个)的时候,这个软件可以获得附加的性能提升,过去的版本是无法做到这一点的。
常规的性能也得到了提高。Oracle表示,按照内部的标准,在Linux上,MySQL 5.5的读写速度比5.1版本提升了360%。在Windows Server机器上,这方面性能的提升超过了1500%。Ulin说:“MySQL 5.5版本的吞吐量更高。”
在复制(replication)方面,这个软件现在支持半同步(semi-synchronous)的复制(replication)了。过去的版本只支持异步的复制,这意味着有新的数据录入原始数据库的时候,数据库的备份拷贝不能马上得到更新。
Ulin说:“如果你在主服务器那边提交了一些东西,你无法确定从服务器何时才能获得这些更新。”使用半同步(semi-synchronous) 的复制(replication),在数据拷贝到备份数据库中以前,正在对数据库提交数据的应用程序都不会收到数据已经录入的确认信息。
Django 项目是一个定制框架,它源自一个在线新闻 Web 站点,于 2005 年以开源的形式被释放出来。Django 框架的核心组件有:
用于创建模型的对象关系映射
为最终用户设计的完美管理界面
一流的 URL 设计
设计者友好的模板语言
缓存系统
http://docs.djangoproject.com/en/dev/
最近做的一个网站项目,开发语言使用的是python,框架是django,django的开发效率毋庸置疑,在效率上可谓非常之快,然而框架的易用性也增加了框架内部实现的复杂性,必然导致性能的下降。
来源:http://calmness.javaeye.com/blog/378082
阅读全文
用于创建模型的对象关系映射
为最终用户设计的完美管理界面
一流的 URL 设计
设计者友好的模板语言
缓存系统
http://docs.djangoproject.com/en/dev/
最近做的一个网站项目,开发语言使用的是python,框架是django,django的开发效率毋庸置疑,在效率上可谓非常之快,然而框架的易用性也增加了框架内部实现的复杂性,必然导致性能的下降。
来源:http://calmness.javaeye.com/blog/378082
阅读全文
/*ex6.c*/
#include <stdlib.h>
#include <stdio.h>
#include <mysql/mysql.h>
MYSQL my_connection;
MYSQL_RES *res_ptr;
MYSQL_ROW sqlrow;
void display_row(MYSQL *ptr);
int main()
{
int res;
mysql_init(&my_connection);
if (mysql_real_connect(&my_connection, "localhost", "test","test", "testdb", 0, NULL, 0))
{
printf("Connection success\n");
res = mysql_query(&my_connection, "SELECT childno, fname, age FROM children WHERE age > 5");
if (res)
{
printf("SELECT error: %s\n", mysql_error(&my_connection));
return -2;
}
else
{
res_ptr = mysql_use_result(&my_connection);
if (res_ptr)
{
printf("Retrieved %lu rows\n",(unsigned long)mysql_num_rows(res_ptr));
while ((sqlrow = mysql_fetch_row(res_ptr)))
{
printf("Fetched data...\n");
display_row(&my_connection);
}
if (mysql_errno(&my_connection))
{
fprintf(stderr, "Retrive error: s\n",mysql_error(&my_connection));
return -3;
}
}
mysql_free_result(res_ptr);
}
mysql_close(&my_connection);
printf("Connection closed.\n");
}
else
{
fprintf(stderr, "Connection failed\n");
if (mysql_errno(&my_connection))
{
fprintf(stderr, "Connection error %d: %s\n",
mysql_errno(&my_connection),mysql_error(&my_connection));
return -1;
}
}
return 0;
}
void display_row(MYSQL *ptr)
{
unsigned int field_count;
field_count=0;
while(field_count<mysql_field_count(ptr))
{
printf("%s ",sqlrow[field_count]);
field_count++;
}
printf("\n");
}
#include <stdlib.h>
#include <stdio.h>
#include <mysql/mysql.h>
MYSQL my_connection;
MYSQL_RES *res_ptr;
MYSQL_ROW sqlrow;
void display_row(MYSQL *ptr);
int main()
{
int res;
mysql_init(&my_connection);
if (mysql_real_connect(&my_connection, "localhost", "test","test", "testdb", 0, NULL, 0))
{
printf("Connection success\n");
res = mysql_query(&my_connection, "SELECT childno, fname, age FROM children WHERE age > 5");
if (res)
{
printf("SELECT error: %s\n", mysql_error(&my_connection));
return -2;
}
else
{
res_ptr = mysql_use_result(&my_connection);
if (res_ptr)
{
printf("Retrieved %lu rows\n",(unsigned long)mysql_num_rows(res_ptr));
while ((sqlrow = mysql_fetch_row(res_ptr)))
{
printf("Fetched data...\n");
display_row(&my_connection);
}
if (mysql_errno(&my_connection))
{
fprintf(stderr, "Retrive error: s\n",mysql_error(&my_connection));
return -3;
}
}
mysql_free_result(res_ptr);
}
mysql_close(&my_connection);
printf("Connection closed.\n");
}
else
{
fprintf(stderr, "Connection failed\n");
if (mysql_errno(&my_connection))
{
fprintf(stderr, "Connection error %d: %s\n",
mysql_errno(&my_connection),mysql_error(&my_connection));
return -1;
}
}
return 0;
}
void display_row(MYSQL *ptr)
{
unsigned int field_count;
field_count=0;
while(field_count<mysql_field_count(ptr))
{
printf("%s ",sqlrow[field_count]);
field_count++;
}
printf("\n");
}
特别注意:-lmysqlclient 没有这个只有mysql.h是仍旧找不到:undefined reference to `mysql_init'的,呵呵。
g++ -g -o test_server test.c -lnsl -I/usr/local/mysql/include/ -L/usr/local/mysql/lib/ -lmysqlclient -lz
curl_setopt($curl, CURLOPT_COOKIE, $curlCookie);
//运行cURL,请求网页
$string = curl_exec($curl);
//$this->debug($string);
//关闭URL请求
curl_close($curl);
$curl = curl_init();
// 设置您需要抓取的URL
$str = 'http://r.qzone.qq.com/cgi-bin/tfriend/cgi_like_check_and_getfansnum.cgi?uin=706290235&mask=1';
//$this->debug($str);
curl_setopt($curl, CURLOPT_URL, $str);
// 设置header
//curl_setopt($curl, CURLOPT_HEADER, 1);
// 设置cURL参数,要求结果保存到字符串中还是输出到屏幕上
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$timeout = 5;
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $timeout);
$curlCookie = "uin={$_COOKIE['uin']}; skey={$_COOKIE['skey']}";
//运行cURL,请求网页
$string = curl_exec($curl);
//$this->debug($string);
//关闭URL请求
curl_close($curl);
$curl = curl_init();
// 设置您需要抓取的URL
$str = 'http://r.qzone.qq.com/cgi-bin/tfriend/cgi_like_check_and_getfansnum.cgi?uin=706290235&mask=1';
//$this->debug($str);
curl_setopt($curl, CURLOPT_URL, $str);
// 设置header
//curl_setopt($curl, CURLOPT_HEADER, 1);
// 设置cURL参数,要求结果保存到字符串中还是输出到屏幕上
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$timeout = 5;
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $timeout);
$curlCookie = "uin={$_COOKIE['uin']}; skey={$_COOKIE['skey']}";
大雁南飞过冬时,为什么雁群总是排成“V”形?
科学家们经过多年的研究,既弄懂这其中的原因,还总结出关于大雁的其他习性:
当带头大雁扇动它的翅膀时,它为紧跟其后的大雁创造了一股向上的动力。按照“V”字队形飞行,整个雁群会比每只鸟单独飞行至少增加71%的飞行距离。
当一只大雁掉队时,它会马上感到单独飞行的阻力,它会很快飞回队形以利用队伍所提供的动力。
当领队的大雁感到疲惫时,“V”字队形中的另一只大雁就会充当领队。在后面的大雁会发出鸣叫声,鼓励前面的大雁保持速度。
如果一只大雁病了,或受了枪伤掉下来时,会有另外两只大雁离开队形,跟着它下来,以帮助和保护它。它们会守着这只大雁,直到它能重新飞行或死去,然后它们靠自己的力量再次出发或跟随另一队大雁去追上自己的队伍。
大雁告诉我们:
一、具有共同方向和群体意识的人们会更容易成功。
二、留在团队中,自己会更快成长。
三、团队领导可以考虑轮流担任,但不是每一个人都有机会。
四、团队精神体现在对理想不放弃,对伙伴不抛弃。
嗯 每一项都很重要 我觉得第四点很重要
理想不放弃,对伙伴不抛弃。
缺少第四点就不叫团队 至少不是真正的团队
所谓人无完人 你团队的任何一个人都有缺点 组建团队的时候就应该清醒的认识到这点 不是出了问题才意识到他不成 然后抛弃一个 然后再遇到一个问题 另外一个人又跟不上了 然后又抛弃一个 这样下去 你也是被抛弃的一份子
阅读全文
科学家们经过多年的研究,既弄懂这其中的原因,还总结出关于大雁的其他习性:
当带头大雁扇动它的翅膀时,它为紧跟其后的大雁创造了一股向上的动力。按照“V”字队形飞行,整个雁群会比每只鸟单独飞行至少增加71%的飞行距离。
当一只大雁掉队时,它会马上感到单独飞行的阻力,它会很快飞回队形以利用队伍所提供的动力。
当领队的大雁感到疲惫时,“V”字队形中的另一只大雁就会充当领队。在后面的大雁会发出鸣叫声,鼓励前面的大雁保持速度。
如果一只大雁病了,或受了枪伤掉下来时,会有另外两只大雁离开队形,跟着它下来,以帮助和保护它。它们会守着这只大雁,直到它能重新飞行或死去,然后它们靠自己的力量再次出发或跟随另一队大雁去追上自己的队伍。
大雁告诉我们:
一、具有共同方向和群体意识的人们会更容易成功。
二、留在团队中,自己会更快成长。
三、团队领导可以考虑轮流担任,但不是每一个人都有机会。
四、团队精神体现在对理想不放弃,对伙伴不抛弃。
嗯 每一项都很重要 我觉得第四点很重要
理想不放弃,对伙伴不抛弃。
缺少第四点就不叫团队 至少不是真正的团队
所谓人无完人 你团队的任何一个人都有缺点 组建团队的时候就应该清醒的认识到这点 不是出了问题才意识到他不成 然后抛弃一个 然后再遇到一个问题 另外一个人又跟不上了 然后又抛弃一个 这样下去 你也是被抛弃的一份子
阅读全文
http://www.verycd.com/topics/2831416/
RPC是glibc提供的函数参数/返回值封装服务, 并将封装结果通过网络传到服务器.
RPC服务端首先要启动portmapper服务.
测试一个简单的RPC传输示例, 先定义一个模板文件test.x
然后可以用rpcgen生成一个Makefile:
这会生成Makefile, 客户端和服务端的程序, 和函数示例.
我们手工修改一下Makefile
修改test_server.c服务端的处理函数, 提供3种服务:
客户端test_client.c, 调用这三种服务:
生成可执行程序test_server和test_client.
我们启动./test_server, 用rpcinfo看看:
再开个终端, 尝试一下调用.
./test_client 127.0.0.1
[PRC1] echo 55, source 55
[RPC2] return 12, should 12
[PRC3] 10+20=30
正是我们期望的.
Add By:Jackxiang
来源:http://www.linuxsir.org/bbs/thread357224.html
RPC服务端首先要启动portmapper服务.
测试一个简单的RPC传输示例, 先定义一个模板文件test.x
program TESTPROG{
version VERSION{
int int_echo(int)=1;
int get_str_len(string)=2;
int add ( int, int ) = 3;
}=1;
}=30000;
内含3个函数, 注意其中一个有2个参数.version VERSION{
int int_echo(int)=1;
int get_str_len(string)=2;
int add ( int, int ) = 3;
}=1;
}=30000;
然后可以用rpcgen生成一个Makefile:
rpcgen -a -N test.x
这会生成Makefile, 客户端和服务端的程序, 和函数示例.
我们手工修改一下Makefile
# This is a template Makefile generated by rpcgen
# Parameters
CLIENT = test_client
SERVER = test_server
SOURCES_CLNT.c =
SOURCES_CLNT.h =
SOURCES_SVC.c =
SOURCES_SVC.h =
SOURCES.x = test.x
TARGETS_SVC.c = test_svc.c test_server.c test_xdr.c
TARGETS_CLNT.c = test_clnt.c test_client.c test_xdr.c
TARGETS = test.h test_xdr.c test_clnt.c test_svc.c
OBJECTS_CLNT = $(SOURCES_CLNT.c:%.c=%.o) $(TARGETS_CLNT.c:%.c=%.o)
OBJECTS_SVC = $(SOURCES_SVC.c:%.c=%.o) $(TARGETS_SVC.c:%.c=%.o)
# Compiler flags
CFLAGS += -g -pipe
LDLIBS += -lnsl
RPCGENFLAGS = -N
# Targets
all : $(CLIENT) $(SERVER)
$(TARGETS) : $(SOURCES.x)
rpcgen $(RPCGENFLAGS) $(SOURCES.x)
$(OBJECTS_CLNT) : $(SOURCES_CLNT.c) $(SOURCES_CLNT.h) $(TARGETS_CLNT.c)
$(OBJECTS_SVC) : $(SOURCES_SVC.c) $(SOURCES_SVC.h) $(TARGETS_SVC.c)
$(CLIENT) : $(OBJECTS_CLNT)
$(LINK.c) -o $(CLIENT) $(OBJECTS_CLNT) $(LDLIBS)
$(SERVER) : $(OBJECTS_SVC)
$(LINK.c) -o $(SERVER) $(OBJECTS_SVC) $(LDLIBS)
clean:
$(RM) core $(TARGETS) $(OBJECTS_CLNT) $(OBJECTS_SVC) $(CLIENT) $(SERVER)
# Parameters
CLIENT = test_client
SERVER = test_server
SOURCES_CLNT.c =
SOURCES_CLNT.h =
SOURCES_SVC.c =
SOURCES_SVC.h =
SOURCES.x = test.x
TARGETS_SVC.c = test_svc.c test_server.c test_xdr.c
TARGETS_CLNT.c = test_clnt.c test_client.c test_xdr.c
TARGETS = test.h test_xdr.c test_clnt.c test_svc.c
OBJECTS_CLNT = $(SOURCES_CLNT.c:%.c=%.o) $(TARGETS_CLNT.c:%.c=%.o)
OBJECTS_SVC = $(SOURCES_SVC.c:%.c=%.o) $(TARGETS_SVC.c:%.c=%.o)
# Compiler flags
CFLAGS += -g -pipe
LDLIBS += -lnsl
RPCGENFLAGS = -N
# Targets
all : $(CLIENT) $(SERVER)
$(TARGETS) : $(SOURCES.x)
rpcgen $(RPCGENFLAGS) $(SOURCES.x)
$(OBJECTS_CLNT) : $(SOURCES_CLNT.c) $(SOURCES_CLNT.h) $(TARGETS_CLNT.c)
$(OBJECTS_SVC) : $(SOURCES_SVC.c) $(SOURCES_SVC.h) $(TARGETS_SVC.c)
$(CLIENT) : $(OBJECTS_CLNT)
$(LINK.c) -o $(CLIENT) $(OBJECTS_CLNT) $(LDLIBS)
$(SERVER) : $(OBJECTS_SVC)
$(LINK.c) -o $(SERVER) $(OBJECTS_SVC) $(LDLIBS)
clean:
$(RM) core $(TARGETS) $(OBJECTS_CLNT) $(OBJECTS_SVC) $(CLIENT) $(SERVER)
修改test_server.c服务端的处理函数, 提供3种服务:
/*
* This is sample code generated by rpcgen.
* These are only templates and you can use them
* as a guideline for developing your own functions.
*/
#include "test.h"
int *
int_echo_1_svc(int arg1, struct svc_req *rqstp)
{
static int result;
//echo.
result=arg1;
printf("[RPC1] source=%d, echo=%d\n", arg1, result);
return &result;
}
int *
get_str_len_1_svc(char *arg1, struct svc_req *rqstp)
{
static int result;
//get strlen.
result=strlen(arg1);
printf("[PRC2] str=%s, len=%d\n", arg1, result);
return &result;
}
int *
add_1_svc(int arg1, int arg2, struct svc_req *rqstp)
{
static int result;
result=arg1+arg2;
printf("[RPC3] %d+%d=%d\n", arg1, arg2, result);
return &result;
}
* This is sample code generated by rpcgen.
* These are only templates and you can use them
* as a guideline for developing your own functions.
*/
#include "test.h"
int *
int_echo_1_svc(int arg1, struct svc_req *rqstp)
{
static int result;
//echo.
result=arg1;
printf("[RPC1] source=%d, echo=%d\n", arg1, result);
return &result;
}
int *
get_str_len_1_svc(char *arg1, struct svc_req *rqstp)
{
static int result;
//get strlen.
result=strlen(arg1);
printf("[PRC2] str=%s, len=%d\n", arg1, result);
return &result;
}
int *
add_1_svc(int arg1, int arg2, struct svc_req *rqstp)
{
static int result;
result=arg1+arg2;
printf("[RPC3] %d+%d=%d\n", arg1, arg2, result);
return &result;
}
客户端test_client.c, 调用这三种服务:
/*
* This is sample code generated by rpcgen.
* These are only templates and you can use them
* as a guideline for developing your own functions.
*/
#include "test.h"
void
testprog_1(char *host)
{
CLIENT *clnt;
int *result_1;
int int_echo_1_arg1=55;
int *result_2;
char *get_str_len_1_arg1="Hello, world";
int *result_3;
int add_1_arg1=10;
int add_1_arg2=20;
clnt = clnt_create (host, TESTPROG, VERSION, "udp");
if (clnt == NULL) {
clnt_pcreateerror (host);
exit (1);
}
result_1 = int_echo_1(int_echo_1_arg1, clnt);
if (result_1 == (int *) NULL) {
clnt_perror (clnt, "call failed");
}
else
printf("[PRC1] echo %d, source %d\n", *result_1,
int_echo_1_arg1);
result_2 = get_str_len_1(get_str_len_1_arg1, clnt);
if (result_2 == (int *) NULL) {
clnt_perror (clnt, "call failed");
}
else
printf("[RPC2] return %d, should %d\n", *result_2,
strlen(get_str_len_1_arg1));
result_3 = add_1(add_1_arg1, add_1_arg2, clnt);
if (result_3 == (int *) NULL) {
clnt_perror (clnt, "call failed");
}
else
printf("[PRC3] %d+%d=%d\n", add_1_arg1, add_1_arg2,
*result_3);
clnt_destroy (clnt);
}
OK, 可以调用make了.* This is sample code generated by rpcgen.
* These are only templates and you can use them
* as a guideline for developing your own functions.
*/
#include "test.h"
void
testprog_1(char *host)
{
CLIENT *clnt;
int *result_1;
int int_echo_1_arg1=55;
int *result_2;
char *get_str_len_1_arg1="Hello, world";
int *result_3;
int add_1_arg1=10;
int add_1_arg2=20;
clnt = clnt_create (host, TESTPROG, VERSION, "udp");
if (clnt == NULL) {
clnt_pcreateerror (host);
exit (1);
}
result_1 = int_echo_1(int_echo_1_arg1, clnt);
if (result_1 == (int *) NULL) {
clnt_perror (clnt, "call failed");
}
else
printf("[PRC1] echo %d, source %d\n", *result_1,
int_echo_1_arg1);
result_2 = get_str_len_1(get_str_len_1_arg1, clnt);
if (result_2 == (int *) NULL) {
clnt_perror (clnt, "call failed");
}
else
printf("[RPC2] return %d, should %d\n", *result_2,
strlen(get_str_len_1_arg1));
result_3 = add_1(add_1_arg1, add_1_arg2, clnt);
if (result_3 == (int *) NULL) {
clnt_perror (clnt, "call failed");
}
else
printf("[PRC3] %d+%d=%d\n", add_1_arg1, add_1_arg2,
*result_3);
clnt_destroy (clnt);
}
生成可执行程序test_server和test_client.
我们启动./test_server, 用rpcinfo看看:
$rpcinfo -p 127.0.0.1
program vers proto port
100000 2 tcp 111 portmapper
30000 1 udp 36307
30000 1 tcp 34883
Bingo! 启动成功.
program vers proto port
100000 2 tcp 111 portmapper
30000 1 udp 36307
30000 1 tcp 34883
Bingo! 启动成功.
再开个终端, 尝试一下调用.
./test_client 127.0.0.1
[PRC1] echo 55, source 55
[RPC2] return 12, should 12
[PRC3] 10+20=30
正是我们期望的.
Add By:Jackxiang
make -f Makefile.test
来源:http://www.linuxsir.org/bbs/thread357224.html
下面我把自己做的Windows与Linux的RPC通信过程和大家分享一下:
1)我按照例子在linux下写了idl文件
/*file.idl*/
program FILE_PROG
{
version FILE_VERSION
{
int file_open(string)=1;
string file_read(string)=2;
int file_write(string)=3;
int file_close(string)=4;
}=1;//版本号
}=112345672;//程序号随便写
2)生用rpcgen成头文件
futuresk@Ubuntu:/usr/test/rpcnew$ rpcgen file.idl
file_clnt.c file.h file_svc.c(一共三个文件)
3)生成客户端文件 file_client.c
root@Ubuntu:/usr/test/bk# rpcgen -Sc -o file_client.c file.idl
4)生成服务端文件 file_server.c
root@Ubuntu:/usr/test/bk# rpcgen -Ss -o file_serverc file.idl
5)对于 file_server.c ,可以对方法自己定义即可,对应的file_client.c也要改一下。比较简单就不再详述
6)自己写好方法之后就可以生成可执行文件了
root@Ubuntu:/usr/test/bk# gcc -Wall -o file_server file_clnt.c file_server.c file_svc.c
root@Ubuntu:/usr/test/bk# gcc -Wall -o file_client file_clnt.c file_client.c
7)可以进行测试
运行服务器端./file_server &
运行客户端 ./file_client localhost
以上是在linux下完成的客户服务器端,现在我们需要做的是把客户端移植到windows下。www.linuxidc.com需要装上vc 6.0或vs2005,这里以vc6.0为例,把上课老师给的rpc windows版本中的rpcgen考到C:\Program Files\Microsoft Visual Studio\VC98\Bin中(我是把vc安装到了c盘),然后把idl文件也放到这个文件夹中,在命令行中执行
rpcgen file.idl(如果提示找不到一个dll文件,就搜索一下这个dll文件并把它考到改文件夹中)
会生成一些头文件,然后把linux下客户端程序(file_client.c)考到和这些头文件在一块的地方,并且要在 file_client.c加上
#include "file_clnt.c"
#pragma comment(lib,"pwrpc32.lib")
直接编译,发现编译成功,如果运行时提示缺少pwrpc32.dll,可以从网上下一个考到系统的system32中或者debug文件夹下。
好了,测试一下,祝你成功!
来源:http://www.linuxidc.com/Linux/2010-09/28870.htm
1)我按照例子在linux下写了idl文件
/*file.idl*/
program FILE_PROG
{
version FILE_VERSION
{
int file_open(string)=1;
string file_read(string)=2;
int file_write(string)=3;
int file_close(string)=4;
}=1;//版本号
}=112345672;//程序号随便写
2)生用rpcgen成头文件
futuresk@Ubuntu:/usr/test/rpcnew$ rpcgen file.idl
file_clnt.c file.h file_svc.c(一共三个文件)
3)生成客户端文件 file_client.c
root@Ubuntu:/usr/test/bk# rpcgen -Sc -o file_client.c file.idl
4)生成服务端文件 file_server.c
root@Ubuntu:/usr/test/bk# rpcgen -Ss -o file_serverc file.idl
5)对于 file_server.c ,可以对方法自己定义即可,对应的file_client.c也要改一下。比较简单就不再详述
6)自己写好方法之后就可以生成可执行文件了
root@Ubuntu:/usr/test/bk# gcc -Wall -o file_server file_clnt.c file_server.c file_svc.c
root@Ubuntu:/usr/test/bk# gcc -Wall -o file_client file_clnt.c file_client.c
7)可以进行测试
运行服务器端./file_server &
运行客户端 ./file_client localhost
以上是在linux下完成的客户服务器端,现在我们需要做的是把客户端移植到windows下。www.linuxidc.com需要装上vc 6.0或vs2005,这里以vc6.0为例,把上课老师给的rpc windows版本中的rpcgen考到C:\Program Files\Microsoft Visual Studio\VC98\Bin中(我是把vc安装到了c盘),然后把idl文件也放到这个文件夹中,在命令行中执行
rpcgen file.idl(如果提示找不到一个dll文件,就搜索一下这个dll文件并把它考到改文件夹中)
会生成一些头文件,然后把linux下客户端程序(file_client.c)考到和这些头文件在一块的地方,并且要在 file_client.c加上
#include "file_clnt.c"
#pragma comment(lib,"pwrpc32.lib")
直接编译,发现编译成功,如果运行时提示缺少pwrpc32.dll,可以从网上下一个考到系统的system32中或者debug文件夹下。
好了,测试一下,祝你成功!
来源:http://www.linuxidc.com/Linux/2010-09/28870.htm