Title:
www.qtchina.net
Description:Fuse module uses the VirtualBox access library to open a
Keywords:Body:
www.qtchina.net
Search this site:
Home
News
Document
Download
About
Linux/C/C++
Blog
Forum
Welcome!
NullGet是使用Qt编写的,运行于多种平台的GUI界面的多线程多协议断点续传下载软件。 使用NullGet可以轻松下载网络的多种协议的数据流,加快下载速度,支持断点续传,目前支持的协议有:HTTP,HTTPS,FTP,MMS,RTSP。而且它能运行于当前大多数流行的操作系统,包括Windows,Linux,FreeBSD等。 下载NullGet
NullFXP 是一个基于Qt 4 开发的SFTP/FTP 客户端软件。目前已经实现基本的多文件上下传功能。详细信息查看本站项目说明页面。 下载nullfxp
我们的目标是打造一个开源的,跨平台的,多线程的,运行稳定的下载软件,另一个就是整理Qt库开发跨平台GUI应用程序的相关资料。欢迎各位朋友对本站开源项目提供意见及建议,欢迎有兴趣的朋友参与本站开源项目,请联系 drswinghead at gmail dot com
kvm 虚拟机直接从virtualbox虚拟磁盘VDI启动的方法
Submitted by liuguangzhao on Mon, 2011-01-31 22:28
in Document
Linux
如果同时使用两种虚拟机,像我现在用的kvm和virtualbox,是不是要分别为两种虚拟机创建两个虚拟磁盘,一般用起来都这么做。但这样多用了一个虚拟磁盘的空间,并且还不能保证两个虚拟机的系统同步,或者即使同步了,也非常麻烦。
今天偶然在网上看到一种解决方法,能让kvkm直接从virtualbox的VDI格式虚拟磁盘启动,两种虚拟机操作的同虚拟磁盘上的同一系统,非常方便。
这里需要用到一个工具,vdfuse,它能直接使用fuse方式挂载vbox虚拟磁盘,如ubuntu11-test.VDI。不过这个工具要自己动手编译。
编译环境,gentoo amd64 系统,virtualbox-4.0.2虚拟机,fuse-2.8.5,
vbox安装在/opt/VirtualBox/目录。
在https://build.opensuse.org/package/files?package=vdfuse amp;project=Virtualization下载几个文件,放在一个目录下,如vdfuse/,然后下面安装,
1.下载文件列表,
VirtualBox-4.0.2-include-only.tar.bz2
vdfuse-vbox4.0.patch
vdfuse-v82.c
2. 解压VirtualBox-4.0.2-include-only.tar.bz2,编译的时候使用vbox的头文件
把该目录中的include拷贝到当前目录,
3. 使用脚本编译,build_vdfuse.sh
#!/bin/sh
export LD_LIBRARY_PATH=/opt/VirtualBox/
gcc vdfuse-v82.c -o vdfuse `pkg-config --cflags --libs fuse` \
-I./include \
-L/opt/VirtualBox/ \
-Wl,-rpath,/opt/VirtualBox/ \
-l:/opt/VirtualBox/VBoxDD.so \
-l:/opt/VirtualBox/VBoxDD2.so \
-l:/opt/VirtualBox/VBoxDDU.so \
-Wall
现在如果没有问题,会生成一个vdfuse可执行程序,
./vdfuse
ERROR: a single mountpoint must be specified
DESCRIPTION: This Fuse module uses the VirtualBox access library to open a
VirtualBox supported VD image file and mount it as a Fuse file system. The
mount point contains a flat directory containing the files EntireDisk,
Partition1 .. PartitionN. These can then be loop mounted to access the
underlying file systems
USAGE: ./vdfuse [options] -f image-file mountpoint
-h help
-r readonly
-t specify type (VDI, VMDK, VHD, or raw; default: auto)
-f VDimage file
-a allow all users to read disk
-w allow all users to read and write to disk
-g run in foreground
-v verbose
-d debug
NOTE: you must add the line "user_allow_other" (without quotes)
to /etc/fuse.confand set proper permissions on /etc/fuse.conf
for this to work.
放在这用,或者拷贝到/usr/bin/下。
5.测试,
mkdir /mnt/vdi
vdfuse -v -d -a -w -f ubuntu11-amd64.vdi /mnt/vdi/
ls -l /mnt/vdi/
total 12580864
-rw-rw-rw- 1 gzleo wheel 6442450944 Jan 31 21:48 EntireDisk
-rw-rw-rw- 1 gzleo wheel 5998903296 Jan 31 21:48 Partition1
-rw-rw-rw- 1 gzleo wheel 441450496 Jan 31 21:48 Partition2
说明挂载vbox虚拟磁盘成功。
6. 使用kvm启动vbox虚拟磁盘
上面挂载后,显示了了三个文件,只需要在kvm -drive file参数指定EntireDisk一个,这其实就是整个磁盘,仔细观察,你会发现这个文件的大小是其他分区文件大小的和。
后面的使用就与kvm一相了,不再重述,可能的问题就是驱动有可能不同,可根据情况修正。
PS:
这种方法对windows有问题,启动不了。
linux,freebsd皆可。
e17 r56388 去hal补丁
Submitted by liuguangzhao on Mon, 2011-01-31 14:40
前段时间把系统的hal USE,今天升级e17的时候发现它还需要依赖hal,通过参数也无法控制,稍微修改了一下代码,编译安装完成后,e17桌面能正常使用,现在还不知道删掉的代码对桌面有什么影响。不过本来e17也就作为一个轻量级备用桌面的,有一点功能问题也没有什么关系。
cat e17-no-hal.patch
Index: src/modules/illume/e_kbd.c
===================================================================
span style="color: #888822;"--- src/modules/illume/e_kbd.c span style="" #40;span版本 span style=""56394spanspan style="" #41;spanspan
span style="color: #888822;"+++ src/modules/illume/e_kbd.c span style="" #40;span工作副本span style="" #41;spanspan
span style="color: #440088;"@@ -span style=""2span,span style=""7span +span style=""2span,span style=""7span @@span
#include quot;e_kbd.h quot;
#include quot;e_mod_layout.h quot;
#include quot;e_cfg.h quot;
span style="color: #991111;"-#include lt;E_Hal.h gt;span
span style="color: #00b000;"+// #include lt;E_Hal.h gt;span
static void _e_kbd_layout_sendspan style="" #40;spanE_Kbd *kbdspan style="" #41;span;
span style="color: #440088;"@@ -span style=""724span,span style=""11span +span style=""724span,span style=""11span @@span
static void
_e_kbd_dbus_cb_dev_input_keyboardspan style="" #40;spanvoid *user_data __UNUSED__, void *reply_data, DBusError *errorspan style="" #41;span
span style="" #123;span
span style="color: #991111;"- E_Hal_Manager_Find_Device_By_Capability_Return *ret = reply_data;span
span style="color: #00b000;"+ // E_Hal_Manager_Find_Device_By_Capability_Return *ret = reply_data;span
Eina_List *l;
char *device;
span style="color: #991111;"- if span style="" #40;spanspan style="" #40;span!retspan style="" #41;span || span style="" #40;span!ret- gt;stringsspan style="" #41;spanspan style="" #41;span return;span
span style="color: #00b000;"+ // if span style="" #40;spanspan style="" #40;span!retspan style="" #41;span || span style="" #40;span!ret- gt;stringsspan style="" #41;spanspan style="" #41;span return;span
if span style="" #40;spandbus_error_is_setspan style="" #40;spanerrorspan style="" #41;spanspan style="" #41;span
span style="" #123;span
span style="color: #440088;"@@ -span style=""736span,span style=""18span +span style=""736span,span style=""18span @@span
return;
span style="" #125;span
span style="color: #991111;"- EINA_LIST_FOREACHspan style="" #40;spanret- gt;strings, l, devicespan style="" #41;spanspan
span style="color: #991111;"- span style="" #123;spanspan
span style="color: #991111;"- _e_kbd_dbus_keyboard_addspan style="" #40;spandevicespan style="" #41;span;span
span style="color: #991111;"- _e_kbd_dbus_keyboard_evalspan style="" #40;spanspan style="" #41;span;span
span style="color: #991111;"- span style="" #125;spanspan
span style="color: #00b000;"+ /* EINA_LIST_FOREACHspan style="" #40;spanret- gt;strings, l, devicespan style="" #41;span */span
span style="color: #00b000;"+ /* span style="" #123;span */span
span style="color: #00b000;"+ /* _e_kbd_dbus_keyboard_addspan style="" #40;spandevicespan style="" #41;span; */span
span style="color: #00b000;"+ /* _e_kbd_dbus_keyboard_evalspan style="" #40;spanspan style="" #41;span; */span
span style="color: #00b000;"+ /* span style="" #125;span */span
span style="" #125;span
static void
_e_kbd_dbus_cb_input_keyboard_isspan style="" #40;spanvoid *user_data, void *reply_data, DBusError *errorspan style="" #41;span
span style="" #123;span
char *udi = user_data;
span style="color: #991111;"- E_Hal_Device_Query_Capability_Return *ret = reply_data;span
span style="color: #00b000;"+ // E_Hal_Device_Query_Capability_Return *ret = reply_data;span
if span style="" #40;spandbus_error_is_setspan style="" #40;spanerrorspan style="" #41;spanspan style="" #41;span
span style="" #123;span
span style="color: #440088;"@@ -span style=""755span,span style=""11span +span style=""755span,span style=""11span @@span
goto error;
span style="" #125;span
span style="color: #991111;"- if span style="" #40;spanret amp; amp; ret- gt;booleanspan style="" #41;spanspan
span style="color: #991111;"- span style="" #123;spanspan
span style="color: #991111;"- _e_kbd_dbus_keyboard_addspan style="" #40;spanudispan style="" #41;span;span
span style="color: #991111;"- _e_kbd_dbus_keyboard_evalspan style="" #40;spanspan style="" #41;span;span
span style="color: #991111;"- span style="" #125;spanspan
span style="color: #00b000;"+ /* if span style="" #40;spanret amp; amp; ret- gt;booleanspan style="" #41;span */span
span style="color: #00b000;"+ /* span style="" #123;span */span
span style="color: #00b000;"+ /* _e_kbd_dbus_keyboard_addspan style="" #40;spanudispan style="" #41;span; */span
span style="color: #00b000;"+ /* _e_kbd_dbus_keyboard_evalspan style="" #40;spanspan style="" #41;span; */span
span style="color: #00b000;"+ /* span style="" #125;span */span
error:
eina_stringshare_delspan style="" #40;spanudispan style="" #41;span;
span style="color: #440088;"@@ -span style=""773span,span style=""10span +span style=""773span,span style=""10span @@span
dbus_error_initspan style="" #40;span amp;errspan style="" #41;span;
dbus_message_get_argsspan style="" #40;spanmsg, amp;err, DBUS_TYPE_STRING, amp;udi, DBUS_TYPE_INVALIDspan style="" #41;span;
span style="color: #991111;"- e_hal_device_query_capabilityspan style="" #40;span_e_kbd_dbus_conn, eina_stringshare_addspan style="" #40;spanudispan style="" #41;span, span
span style="color: #991111;"- quot;input.keyboard quot;,span
span style="color: #991111;"- _e_kbd_dbus_cb_input_keyboard_is, span
span style="color: #991111;"- span style="" #40;spanvoid*span style="" #41;spaneina_stringshare_addspan style="" #40;spanudispan style="" #41;spanspan style="" #41;span;span
span style="color: #00b000;"+ /* e_hal_device_query_capabilityspan style="" #40;span_e_kbd_dbus_conn, eina_stringshare_addspan style="" #40;spanudispan style="" #41;span, */span
span style="color: #00b000;"+ /* quot;input.keyboard quot;, */span
span style="color: #00b000;"+ /* _e_kbd_dbus_cb_input_keyboard_is, */span
span style="color: #00b000;"+ /* span style="" #40;spanvoid*span style="" #41;spaneina_stringshare_addspan style="" #40;spanudispan style="" #41;spanspan style="" #41;span; */span
span style="" #125;span
static void
span style="color: #440088;"@@ -span style=""857span,span style=""24span +span style=""857span,span style=""24span @@span
if span style="" #40;span_e_kbd_dbus_connspan style="" #41;span
span style="" #123;span
span style="color: #991111;"- e_hal_manager_find_device_by_capabilityspan style="" #40;span_e_kbd_dbus_conn, quot;input.keyboard quot;,span
span style="color: #991111;"- _e_kbd_dbus_cb_dev_input_keyboard, NULLspan style="" #41;span;span
span style="color: #00b000;"+ /* e_hal_manager_find_device_by_capabilityspan style="" #40;span_e_kbd_dbus_conn, quot;input.keyboard quot;, */span
span style="color: #00b000;"+ /* _e_kbd_dbus_cb_dev_input_keyboard, NULLspan style="" #41;span; */span
span style="color: #991111;"- _e_kbd_dbus_handler_dev_add =span
span style="color: #991111;"- e_dbus_signal_handler_addspan style="" #40;span_e_kbd_dbus_conn, E_HAL_SENDER,span
span style="color: #991111;"- E_HAL_MANAGER_PATH,span
span style="color: #991111;"- E_HAL_MANAGER_INTERFACE,span
span style="color: #991111;"- quot;DeviceAdded quot;, _e_kbd_dbus_cb_dev_add, NULLspan style="" #41;span;span
span style="color: #991111;"- _e_kbd_dbus_handler_dev_del =span
span style="color: #991111;"- e_dbus_signal_handler_addspan style="" #40;span_e_kbd_dbus_conn, E_HAL_SENDER,span
span style="color: #991111;"- E_HAL_MANAGER_PATH,span
span style="color: #991111;"- E_HAL_MANAGER_INTERFACE,span
span style="color: #991111;"- quot;DeviceRemoved quot;, _e_kbd_dbus_cb_dev_del, NULLspan style="" #41;span;span
span style="color: #991111;"- _e_kbd_dbus_handler_dev_chg =span
span style="color: #991111;"- e_dbus_signal_handler_addspan style="" #40;span_e_kbd_dbus_conn, E_HAL_SENDER,span
span style="color: #991111;"- E_HAL_MANAGER_PATH,span
span style="color: #991111;"- E_HAL_MANAGER_INTERFACE,span
span style="color: #991111;"- quot;NewCapability quot;, _e_kbd_dbus_cb_cap_add, NULLspan style="" #41;span;span
span style="color: #00b000;"+ /* _e_kbd_dbus_handler_dev_add = */span
span style="color: #00b000;"+ /* e_dbus_signal_handler_addspan style="" #40;span_e_kbd_dbus_conn, E_HAL_SENDER, */span
span style="color: #00b000;"+ /* E_HAL_MANAGER_PATH, */span
span style="color: #00b000;"+ /* E_HAL_MANAGER_INTERFACE, */span
span style="color: #00b000;"+ /* quot;DeviceAdded quot;, _e_kbd_dbus_cb_dev_add, NULLspan style="" #41;span; */span
span style="color: #00b000;"+ /* _e_kbd_dbus_handler_dev_del = */span
span style="color: #00b000;"+ /* e_dbus_signal_handler_addspan style="" #40;span_e_kbd_dbus_conn, E_HAL_SENDER, */span
span style="color: #00b000;"+ /* E_HAL_MANAGER_PATH, */span
span style="color: #00b000;"+ /* E_HAL_MANAGER_INTERFACE, */span
span style="color: #00b000;"+ /* quot;DeviceRemoved quot;, _e_kbd_dbus_cb_dev_del, NULLspan style="" #41;span; */span
span style="color: #00b000;"+ /* _e_kbd_dbus_handler_dev_chg = */span
span style="color: #00b000;"+ /* e_dbus_signal_handler_addspan style="" #40;span_e_kbd_dbus_conn, E_HAL_SENDER, */span
span style="color: #00b000;"+ /* E_HAL_MANAGER_PATH, */span
span style="color: #00b000;"+ /* E_HAL_MANAGER_INTERFACE, */span
span style="color: #00b000;"+ /* quot;NewCapability quot;, _e_kbd_dbus_cb_cap_add, NULLspan style="" #41;span; */span
span style="" #125;span
span style="" #125;span
linux下远程管理利器tmux试用
Submitted by liuguangzhao on Fri, 2011-01-28 23:28
in Document
Linux
* 简介
o tmux 是screen 一个替代品,优点是比screen 配置简单,并且功能不比screen 弱; tmux 默认就有下面的statusbar ,下面显示正在运行的程序名字,当然screen 也可以配置成这样。
启动,tmux
恢复,tmux attach
其他命令见man tmux
试用了10分钟,感觉比上次试用screen的时候好,简单易用,不用怎么配置也有非常好的效果。
如果在服务器端机器写程序,不再受不稳定网络的影响,掉线后连接服务器,直接恢复之前所有的状态,从中断的地方继承之前的工作,非常方便。
tmux相比screen有优势的地方,可以横向/纵向分隔窗口。配置简单,甚至不需要配置也能用。都说代码比screen清晰,易于改进扩展。tmux的确是非常好的工具。
在本机上使用tmux,连接到服务器,那么,发送的tmux快捷键会发送给本地的tmux还是远程的tmux,这个地方有冲突,是否能解决。
uxterm设置中文字体及中文字体间距
Submitted by liuguangzhao on Fri, 2011-01-28 21:32
in Document
在.Xdefaults修改为这部分,中英文都能正常显示,中文输入法也ok:
! TrueType font
UXTerm*faceName: DejaVu Sans Mono
!UXTerm*faceNameDoublesize: WenQuanYi Bitmap Song
UXTerm*faceNameDoublesize: WenQuanYi Zen Hei
!UXTerm*faceSize: 12
修改完后,xrdb .Xdefaults生效,
启动uxterm,看显示了没有。
CLISP实践,编写unix常用命令cat
Submitted by liuguangzhao on Fri, 2011-01-28 17:30
in Document
用到了clisp中的几个变量,*args*, *standard-output*, *standard-input*,
文件打开函数,文件读取函数,文件写入函数。
为了练习clisp而实现,效率没有考虑,比如一个字符一个字符读写,效率就非常低,但cat命令的基本的显示文件内容功能实现了。
这个风格是否符合lisp程序的风格,感觉还是像写C程序的风格。
./cat.lisp cat.lisp
#span style="color: #66cc66;"!span/usr/bin/clisp -E UTF-span style="color: #cc66cc;"8span
span style="color: #808080; font-style: italic;"; (print (length *args*))span
span style="color: #808080; font-style: italic;"; (print *args*)span
span style="color: #808080; font-style: italic;"; checking optionspan
span style="color: #66cc66;" #40;spanspan style="color: #b1b100;"ifspan span style="color: #66cc66;" #40;spanspan style="color: #b1b100;"notspan span style="color: #66cc66;" #40;spanspan style="color: #66cc66;"=span span style="color: #cc66cc;"1span span style="color: #66cc66;" #40;spanspan style="color: #b1b100;"lengthspan *args*span style="color: #66cc66;" #41;spanspan style="color: #66cc66;" #41;spanspan style="color: #66cc66;" #41;span
span style="color: #66cc66;" #40;spanspan style="color: #b1b100;"prognspan span style="color: #66cc66;" #40;spanprint span style="color: #ff0000;" quot;need a file path as args. cat lt;filename gt;. quot;spanspan style="color: #66cc66;" #41;span span style="color: #66cc66;" #40;spanquitspan style="color: #66cc66;" #41;spanspan style="color: #66cc66;" #41;span
span style="color: #66cc66;" #41;span
span style="color: #808080; font-style: italic;"; (setq fname quot;/home/gzleo/xorg.conf quot;)span
span style="color: #66cc66;" #40;spanspan style="color: #b1b100;"setqspan fname span style="color: #66cc66;" #40;spanfirst *args*span style="color: #66cc66;" #41;spanspan style="color: #66cc66;" #41;span
span style="color: #808080; font-style: italic;"; open firstspan
span style="color: #66cc66;" #40;spanspan style="color: #b1b100;"setqspan fp
span style="color: #66cc66;" #40;spanopen fname span style="color: #66cc66;":spanspan style="color: #555;"element-typespan 'base-char span style="color: #66cc66;":spanspan style="color: #555;"directionspan span style="color: #66cc66;":spanspan style="color: #555;"inputspan span style="color: #66cc66;":spanspan style="color: #555;"external-formatspan span style="color: #66cc66;":spanspan style="color: #555;"defaultspanspan style="color: #66cc66;" #41;span
span style="color: #66cc66;" #41;span
span style="color: #808080; font-style: italic;"; (print fp)span
span style="color: #66cc66;" #40;spanspan style="color: #b1b100;"setqspan *stdout* *standard-output*span style="color: #66cc66;" #41;span
span style="color: #66cc66;" #40;spanspan style="color: #b1b100;"setqspan *stdin* *standard-input*span style="color: #66cc66;" #41;span
span style="color: #808080; font-style: italic;";(setq *stderr* *standard-error*)span
span style="color: #66cc66;" #40;spanspan style="color: #b1b100;"dospan span style="color: #66cc66;" #40;spanspan style="color: #66cc66;" #40;spanc span style="color: #66cc66;" #40;spanread-char fpspan style="color: #66cc66;" #41;span span style="color: #66cc66;" #40;spanread-char fp span style="color: #b1b100;"nilspan 'the-endspan style="color: #66cc66;" #41;spanspan style="color: #66cc66;" #41;spanspan style="color: #66cc66;" #41;span
span style="color: #66cc66;" #40;spanspan style="color: #66cc66;" #40;spanspan style="color: #b1b100;"notspan span style="color: #66cc66;" #40;spancharacterp cspan style="color: #66cc66;" #41;spanspan style="color: #66cc66;" #41;spanspan style="color: #66cc66;" #41;span
span style="color: #66cc66;" #40;spanwrite-char c *stdout*span style="color: #66cc66;" #41;span
span style="color: #66cc66;" #41;span
span style="color: #66cc66;" #40;spanclose fpspan style="color: #66cc66;" #41;span
span style="color: #808080; font-style: italic;"; (print fp)span
kde 4中隐藏窗口标题栏
Submitted by liuguangzhao on Wed, 2011-01-19 21:26
in Document
KDE
Linux
linux系统一个很强的特点就是可定制功能,所以看到的linux系统的桌面千变万化,各有特色。
最近正值linux桌面飞速发展的阶段,使用linux的人越多,对linux的要求也越高了。
我使用最多的是主流桌面之一,KDE 4,相比其他桌面系统确实庞大了许多,但功能齐全,不用费很多时间在桌面上。我的工作是做linux系统上跑的一些服务软件,根本用不到漂亮的桌面,其实对桌面了解的也比较少。
由于笔记本屏幕大小的原因,需要对屏幕空间尽量全部发挥,争取一点不浪费。现在有的方案,一个全局菜单方案,把所有应用程序的菜单放在一行,随着应用程序的切换动态变化,这是mac os x历来的做法,现在也在向linux上发展。另外一个还要把窗口听标题栏去掉,这样又节省了一行空间,感觉屏幕利用率又提高了不少。且把后者的设置方法记录在此,前者的设置方法可在本站搜索一下。
方法比较简单,假设使用的是kde4桌面系统,只需要用两个命令,
第一步,修改配置文件
kwriteconfig --file oxygenrc --group Windeco --key HideTitleBar --type bool true
第二步,重启kwin窗口管理器
kwin --replace amp;
这时就看到所有窗口的标题栏已经消失了。
那么现在有一个问题,如果想移动窗口,怎么办,
使用快捷键ALT+F3调出窗口菜单,选择移动窗口即可,可用鼠标或者键盘移动窗口。
或者直接使用鼠标,在窗口边缘右键调用窗口菜单,选择移动窗口即可。
现在对上面的命令简单解释,
kwriteconfig命令是kde4桌面系统自带的一个命令,用于修改kde的相关配置文件,在$HOME/.kde4/share/config/目录下。
这里就是修改了$HOME/.kde4/share/config/oxygenrc配置文件,把Windeco一节中的HideTitleBar改/添为值true,让kwin窗口管理器不显示标题栏。
kwin --replace amp;是重启kwin, 让上面的更改立即生效。
如果使用其他的窗口管理器,大多数有类似的功能,以前用过的openbox也可如此设置。
效果图:
使用linux系统快乐。
加附kde一快捷键,ALT+左键, 可以点击窗口的空白区域,移动窗口,这对无标题栏的桌面非常有用。
原来qt的qmake已经能使用pkgconfig功能了
Submitted by liuguangzhao on Tue, 2011-01-18 11:11
in C++
Document
Linux
Qt4
还没确定从哪版本开始支持的,我现在用的qt 4.7.1是已经支持了的,好像是在4.7.0版本加入的这个功能。
使用方法,
CONFIG += link_pkgconfig # enable the PKGCONFIG feature
PKGCONFIG += glib-2.0 # link against glib-2.0
另外,还可检没某个包是否存在,
packagesExist(glib-2.0) {
DEFINES += HAS_GLIB
PKGCONFIG += glib-2.0
}
// and in the code:
#ifdef HAS_GLIB
// use glib here
#endif
这样使用pkgconfig的功能,已经非常简便了
还有一点疑问,这个在非linux系统上,如mac, win上是什么表现呢。
使用select+blocked socketpair模拟新版本内核才支持的nonblock socketpair
Submitted by liuguangzhao on Wed, 2011-01-12 23:36
in C++
Document
Linux
话说服务器系统太老真是不爽,现在使用大多数服务器系统都是debian5,而这个系统的内核版本2.6.26,glibc 2.7,一些很方便的函数像pipe2, nonblock socketpair恰好从内核2.6.27开始支持,需要用到这个功能,又不能不兼容这要部署的服务器版本,真郁闷。
现在要实现一个线程间的非阻塞通信,本来在使用的桌面系统上找到pipe2,从man手册上看完全符合使用要求,没想到在服务器上先测试了一下,直接没有这个函数,查了一下手册,这个原来从glibc 2.9加入的。
后面又找到了socketpair函数,这个也非常方便,这回还先看了一下服务器,有这个函数,可谁知系统又没有定义一个叫SOCK_NONBLOCK的宏,无法使用它的nonblock模式。
苦苦思索一番,找到一种解决办法,完整的方法是,
使用#ifdef编译指令,加select block模式的socketpair,这样即能在新系统上使用,也可在比较旧的系统上运行。
大概步骤如下,
首先使用socketpair创建一对已经连接的socket,
#ifdef HAVE_SOCK_NONBLOCK
socketpair(AF_LOCAL, SOCK_STREAM | SOCK_NONBLOCK, 0, sv);
#else
socketpair(AF_LOCAL, SOCK_STREAM, 0, sv);
#endif
现在读取,
#ifdef HAVE_SOCK_NONBLOCK
// here will not block of couse
read(sv[0], rbuf, 1000);
#else
fd_set rd_fds;
FD_ZERO( amp;rd_fds);
struct timeval timev;
timev.tv_sec = 0;
timev.tv_usec = 1000; // 1ms
FD_SET(sv[0], amp;rd_fds);
if (select(sv[0]+1, amp;rd_fds, 0, 0, amp;timev) == 1) {
assert(FD_ISSET(sv[0], amp;rd_fds);
// has data, can read, so here also will not be block
read(sv[0], rbuf, 1000);
}
如果把timev.tv_use设置为0,则会立即返回,就像真正的读取一个nonblock socket一样,这里还可选择地block几个ms时间,也算非常灵活。
不过现在debian6快发了,以后新安装的服务器应试能用上debian6了,这些新功能就直接可用了。
Linux Kernel 2.6.37发布
Submitted by liuguangzhao on Sat, 2011-01-08 11:58
in Linux
News
Linux 内核 2.6.37 发布,带来 Ext4 性能提升及 I/O 节流控制支持。
Ext4 文件系统默认使用Block I/O 模式,实现更好的多核系统扩展支持;同时延期创建节点列表,提高文件系统创建速度。
XFS 文件系统扩展性提升。
全面移除BKL (Big Kernel Lock),允许编译一个完全没有 BKL 的内核。
为 Ceph 分布式网络文件系统引入 RBD(Rados block device)从而实现类似块设备的功能。
I/O节流阀支持:允许为一个或一组进程指定可以使用的最大的 I/O 值。
"Jump label":被禁用的静态跟踪点将不会对性能产生任何影响。
Btrfs 更新:支持将空闲空间缓存到硬盘上,支持异步建立快照,快分配时支持元数据及数据混合。
提升了 Perf 的探测能力。
电源管理改善:休眠景象的 LZO 压缩及设备延迟挂起支持。
支持 PPP over IPv4:显著提升 PPTP VPN 的连接速度,并大幅度降低 CPU 占有率。
KDE 4.6 RC 2 发布
Submitted by liuguangzhao on Thu, 2011-01-06 08:54
in KDE
News
KDE 社区刚发布了 4.6 的第二个 RC 版本,包括工作空间、应用程序以及开发平台。这将是 4.6 的最后一个 RC 版本,而正式版将于本月 26 日发布。
KDE,K桌面环境(Kool Desktop Environment)的缩写。一种著名的运行于 Linux、Unix 以及FreeBSD 等操作系统上面自由图形工作环境,整个系统采用的都是 TrollTech 公司所开发的 Qt 程序库(现在属于诺基亚公司)。KDE 和 Gnome 都是 Linux 操作系统上最流行的桌面环境系统。
1
2
3
4
5
6
7
8
9
…
next ›
last »
Nullget Billboard
本 站推出跨平台 (Linux/Windows/Unix/FreeBSD/Mac OS X) 的基于 Qt4 的 SFTP/FTP 客户端软件 nullfxp 2.1.0 Release,到下载页面下载预览 . 本版本的 nullfxp 修正许多Bug, 改进会话管理,详情见 nullfxp 2.1.0 Release note。( 2010/10/01)
Qt Abstract
Qt 是一个多平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的很容易扩展,并且 允许真正地组件编程。
详细信息请参见:Trolltech(奇趣)
日志分类
Linux/Unix操作系统
Apple操作系统
Windows操作系统
C/C++编程
Qt/Gtk+编程
WEB/PHP/Script开发
OMPS数据库
KDE桌面应用
硬件、数码
生活随笔
我的图书馆
-- 中国文学
Links
Archives
February 2011
SunMonTueWedThuFriSat
303112345
6789101112
13141516171819
20212223242526
272812345
User Login
Log in Register
Request new password
Copyright © 2000-2010 www.qtchina.net .
Last modified:
2010-11-22 13:12. Hits: 3,290,539; Pages: 1,273,201
center