头文件:
#include <unistd.h>
函数:
int pipe(int fd[2]); 创建无名管道。
fd[2]:管道两个文件描述符,fd[0]代表读端(管道头),fd[1]代表写端(管道尾)。
创建成功返回0,失败返回-1。
创建成功之后可以像操作普通文件一样使用read、write进行读写操作。
例子:
1 | /********************************** |
头文件:
#include <unistd.h>
函数:
int pipe(int fd[2]); 创建无名管道。
fd[2]:管道两个文件描述符,fd[0]代表读端(管道头),fd[1]代表写端(管道尾)。
创建成功返回0,失败返回-1。
创建成功之后可以像操作普通文件一样使用read、write进行读写操作。
例子:
1 | /********************************** |
创建进程
所需头文件:
#include <unistd.h>
#include <sys/types.h>
函数:
pid_t fork(); 创建一个子进程,在子进程中返回0,在父进程中返回子进程ID,出错则返回-1。
pid_t vfor(); 创建一个子进程,与fork()相似;区别如下:
fork()子进程拷贝父进程数据段、堆栈段,vfork()则是共享;
fork()父子进程执行顺序不确定,vfork()是先执行完子进程再执行父进程。
pid_t getpid(); 返回当前进程ID
pid_t getppid(); 返回父进程ID
进程等待
头文件:
#include <sys/wait.h>
函数:
pid_t wait(int *status); 等子进程结束之后才运行。
status:接收子进程返回状态
pid_t waitpid(pid_t pid, int *status, int options); 与waitpid()相似。
pid:指定的进程号,当pid=-1时等待任何子进程,相当于wait();
status:用于接收进程返回状态;
option:为WNOHANG时若无任何已结束的子进程则马上返回,不予以等待;为WUNTRACES时若子进程暂停则马上返回,不予以理会结束状态。
例子:
1 | //使用vfor函数创建子进程 |
既然是静态编译,那就要编译出来的程序不信赖于任何dll文件。
首先下载qt-win-opensource-4.7.4-mingw.exe: http://get.qt.nokia.com/qt/source/qt-win-opensource-4.7.4-mingw.exe 和MinGW-gcc440_1.zip: http://get.qt.nokia.com/misc/MinGW-gcc440_1.zip
然后依次解压MinGW-gcc440_1.zip、安装qt-win-opensource-4.7.4-mingw.exe。记得要将gcc的目录和qt的目录添加到环境变量中。
然后打开DOS窗口并切换到Qt的目录(比如我的是D:\Qt\4.7.4),再设置两个变量
set QTDIR=D:\Qt\4.7.4
set QMAKESPEC=win32-g++
再编辑D:\Qt\4.7.4\mkspecs\win32-g++\qmake.conf文件(最好先备份),改两处:
QMAKE_LFLAGS = -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
修改为
QMAKE_LFLAGS = -static -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
再将
QMAKE_LFLAGS_DLL = -shared
修改为
QMAKE_LFLAGS_DLL = -static
再执行命令:
configure -platform win32-g++ -release -opensource -static -fast -qt-sql-sqlite -plugin-sql-sqlite -qt-zlib -qt-gif -qt-libpng -qt-libmng -qt-libtiff -qt-libjpeg -no-webkit -nomake examples -nomake docs -nomake demos
如果有提问是否遵守LGPL协议,选y。配置完成后,最后两句是这样的:
Qt is now configured for building. Just run mingw32-make.
To reconfigure, run mingw32-make confclean and configure.
cd src
mingw32-make -i -k
注意:我们只在在Qt子目录src里运行make。不要在整个qt库的大目录下运行make。只在src目录make,这样只编译核心的Qt库和一些插件,节省时间,而且有核心Qt库就够用了。
如果在D:\Qt\4.7.4\ 整个大目录下运行make,那么make还会去重新编译生成tools目录下的代码,重新做工具程序,像assistant.exe、designer.exe、linguist.exe、qmlviewer.exe等等(生成后全在bin目录)。这些工具使用静态库生成后巨大无比。这些工具程序不管是静态链接还是动态链接生成的,对我们编程压根没影响,都一样用。
好了,接下来就是漫长的等待。2个多小时左右就应该可以编译完成了。
此时再用Qt编译生成的可执行文件不用再信赖Qt的动态库了,但是文件比较大随便一个都是10M以上,而且如果使用的是从qt官网下载的MinGW-gcc编译生成的可执行文件还是会信赖mingwm10.dll动态库。这个只需换一个版本的编译器即可,我用的是这个: http://115.com/file/dn3fkn1g
如果嫌这个过程太麻烦可以直接下载我编译好的静态库来使用:
Qt4.7.4_Win32静态库.part1.rar: http://115.com/file/dn3zwayy
Qt4.7.4_Win32静态库.part2.rar: http://115.com/file/dn3zwa9g
这个是完整版的,解压下来有2G多。如果觉得太大了可以下载精简版:
Qt4.7.4_Win32静态库精简版.rar: http://115.com/file/bhy7bat6
精简版只保留了编译时需要的库文件和qmake等必要的工具,解压下来有500M左右。
注意:只有解压到D盘根目录下才能使用
编译器用的是mingw-7.2.exe: http://115.com/file/dn3fkn1g
首先感谢hangyu网友分享的GTK静态库。
原帖地址:http://forum.ubuntu.org.cn/viewtopic.php?f=162&t=354286
下载地址:http://code.google.com/p/static-gtk2-mingw32/
先说一下在Windows下编译的方法。
解压文件,然后进入解压后的bin目录执行命令:
pkg-config.exe –libs –cflags “gtk+-2.0”
如果出现以下错误
Package gtk+-2.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `gtk+-2.0.pc’
to the PKG_CONFIG_PATH environment variable
No package ‘gtk+-2.0’ found
则先执行命令:set PKG_CONFIG_PATH=你的解压路径\lib\pkgconfig 设置PKG_CONFIG_PATH环境变量
我得到的结果是:
-mms-bitfields -IE:/Dev-Cpp/gtk+-2.0/include/gtk-2.0 -IE:/Dev-Cpp/gtk+-2.0/lib/gtk-2.0/include -IE:/Dev-Cpp/gtk+-2.0/include/atk-1.0 -IE:/Dev-Cpp/gtk+-2.0/include/cairo -IE:/Dev-Cpp/gtk+-2.0/include/gdk-pixbuf-2.0 -IE:/Dev-Cpp/gtk+-2.0/include/pango-1.0 -IE:/Dev-Cpp/gtk+-2.0/include/glib-2.0 -IE:/Dev-Cpp/gtk+-2.0/lib/glib-2.0/include -IE:/Dev-Cpp/gtk+-2.0/include/pixman-1 -IE:/Dev-Cpp/gtk+-2.0/include -IE:/Dev-Cpp/gtk+-2.0/include/freetype2 -I/gtk-dev/include/libpng14 -LE:/Dev-Cpp/gtk+-2.0/lib -L/gtk-dev/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -limm32 -lshell32 -luuid -latk-1.0 -lpangocairo-1.0 -lgio-2.0 -lshlwapi -ldnsapi -lgdk_pixbuf-2.0 -ltiff -ljpeg -ljasper -lpangoft2-1.0 -lpangowin32-1.0 -lusp10 -lfontconfig -lexpat -lpango-1.0 -lcairo -lpixman-1 -lfreetype -lmsimg32 -lgdi32 -lpng -lz -lm -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lglib-2.0 -lintl -liconv -lws2_32 -lole32
记得保存这个结果,作为编译时的参数在后面要用到。
然后编译一个程序试试,将以下代码保存为test.c文件。
1 |
|
执行命令进行编译:
gcc -o test.exe test.c -mms-bitfields -IE:/Dev-Cpp/gtk+-2.0/include/gtk-2.0 -IE:/Dev-Cpp/gtk+-2.0/lib/gtk-2.0/include -IE:/Dev-Cpp/gtk+-2.0/include/atk-1.0 -IE:/Dev-Cpp/gtk+-2.0/include/cairo -IE:/Dev-Cpp/gtk+-2.0/include/gdk-pixbuf-2.0 -IE:/Dev-Cpp/gtk+-2.0/include/pango-1.0 -IE:/Dev-Cpp/gtk+-2.0/include/glib-2.0 -IE:/Dev-Cpp/gtk+-2.0/lib/glib-2.0/include -IE:/Dev-Cpp/gtk+-2.0/include/pixman-1 -IE:/Dev-Cpp/gtk+-2.0/include -IE:/Dev-Cpp/gtk+-2.0/include/freetype2 -I/gtk-dev/include/libpng14 -LE:/Dev-Cpp/gtk+-2.0/lib -L/gtk-dev/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -limm32 -lshell32 -luuid -latk-1.0 -lpangocairo-1.0 -lgio-2.0 -lshlwapi -ldnsapi -lgdk_pixbuf-2.0 -ltiff -ljpeg -ljasper -lpangoft2-1.0 -lpangowin32-1.0 -lusp10 -lfontconfig -lexpat -lpango-1.0 -lcairo -lpixman-1 -lfreetype -lmsimg32 -lgdi32 -lpng -lz -lm -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lglib-2.0 -lintl -liconv -lws2_32 -lole32
如果不出错的话则生成一个test.exe的可执行文件。
如果没有gcc的话,可以下载安装一个MinGW程序,我之前用MinGW的gcc 4.4.0版本来编译结果出错了,然后换了个4.6版本的才能顺利编译,下载地址:http://nuwen.net/mingw.html
然后再介绍下在Linux下交叉编译的方法。
前一篇文章介绍了在Linux下交叉编译Windows程序的方法。现在只需把上面的参数的路径改下即可。
我的Windows的E盘在Linux下挂载到/mnt/Win_E ,再用上面的程序测试,执行命令:
i486-mingw32-gcc -o test.exe test.c -mms-bitfields -I/mnt/Win_E/Dev-Cpp/gtk+-2.0/include/gtk-2.0 -I/mnt/Win_E/Dev-Cpp/gtk+-2.0/lib/gtk-2.0/include -I/mnt/Win_E/Dev-Cpp/gtk+-2.0/include/atk-1.0 -I/mnt/Win_E/Dev-Cpp/gtk+-2.0/include/cairo -I/mnt/Win_E/Dev-Cpp/gtk+-2.0/include/gdk-pixbuf-2.0 -I/mnt/Win_E/Dev-Cpp/gtk+-2.0/include/pango-1.0 -I/mnt/Win_E/Dev-Cpp/gtk+-2.0/include/glib-2.0 -I/mnt/Win_E/Dev-Cpp/gtk+-2.0/lib/glib-2.0/include -I/mnt/Win_E/Dev-Cpp/gtk+-2.0/include/pixman-1 -I/mnt/Win_E/Dev-Cpp/gtk+-2.0/include -I/mnt/Win_E/Dev-Cpp/gtk+-2.0/include/freetype2 -I/gtk-dev/include/libpng14 -L/mnt/Win_E/Dev-Cpp/gtk+-2.0/lib -L/gtk-dev/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -limm32 -lshell32 -luuid -latk-1.0 -lpangocairo-1.0 -lgio-2.0 -lshlwapi -ldnsapi -lgdk_pixbuf-2.0 -ltiff -ljpeg -ljasper -lpangoft2-1.0 -lpangowin32-1.0 -lusp10 -lfontconfig -lexpat -lpango-1.0 -lcairo -lpixman-1 -lfreetype -lmsimg32 -lgdi32 -lpng -lz -lm -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lglib-2.0 -lintl -liconv -lws2_32 -lole32
然后生成 test.exe文件,可以用wine来测试下是否可用。
这个生成的文件好像有点大了,随便一个都是25M以上。使用命令:
i486-mingw32-strip hellow.exe
一下子可以减到7M左右。
有时候需要编写在Windows下运行的程序,但是又不想切换到Windows下来编译,于是就想在Linux下来编译Windows下运行的exe文件。
这个需要先安装mingw32交叉编译工具。
ubuntu下使用命令:sudo apt-get install mingw32进行安装,
Arch Linux下使用命令:sudo pacman -S mingw32-binutils mingw32-gcc mingw32-pthreads mingw32-runtime mingw32-w32api
安装完后测试一下效果。
将以下代码保存为mingw32_test.c文件。
1 | int main(int argc, char *argv) |
然后执行命令:
[lcj@lcj C]$ i486-mingw32-gcc -o mingw32_test.exe mingw32_test.c
mingw32_test.c: In function 'main':
mingw32_test.c:3:5: warning: incompatible implicit declaration of built-in function 'printf' [enabled by default]
[lcj@lcj C]$ wine mingw32_test.exe
Windows Compiler Test
http://www.xefan.com
[lcj@lcj C]$
经测试在wine下能正常运行,在虚拟机里的WinXP下测试也可正常运行。
我用的是Arch Linux,不过不同的版本应该都差不多吧。
1、首先安装nfs-utils软件包。
2、修改/ect/exports文件,添加分享,格式为:
路径 允许的主机(属性)
如:/opt/arm 192.168.1.*(ro,sync,no_root_squash)
3、启动nfs服务。
执行命令:/etc/rc.d/nfs-server start
现在可以在其他主机上使用mount命令来挂载该主机的分享目录,命令格式:mount -t nfs -o nolock 主机:/路径 挂载点
如:mount -t nfs -o nolock 192.168.1.100:/opt/arm /mnt/nfs
如果挂载时出现提示:mount.nfs: access denied by server while mounting,说明请求被拒绝了。
修改/ect/hosts.allow文件(没有请自行创建),添加允许,格式
portmap: 主机/网段 :allow
如:
portmap: 192.168.1.100 :allow
portmap: 192.168.1.0/255.255.255.0 :allow
我用的是Arch Linux,不过各个版本的Linux的设置应该都差不多吧。
1、首先安装samba。
2、/etc/samba/smb.conf为samba的配置文件,所有的修改操作都在此文件中进行。/etc/samba/smb.conf.default为配置模板,可以参照其进行配置。
例如要添加一项分享,可以修改/ect/samba/smb.conf文件,添加如下内容:
[printers] #显示分享名
comment = All Printers
path = /var/spool/samba #分享的路径
browseable = yes #允许浏览
# Set public = yes to allow user 'guest account' to print
guest ok = yes #允许匿名访问
writable = yes #可写
printable = yes
3、启动samba服务。
执行命令:/etc/rc.d/samba start
现在在Windows下可以直接在地址栏输入“\主机ip ”进行访问;在Linux下可以使用smbclient命令进行连接。
smbclient命令使用方法:
列出服务器上共享 #smbclient -L 机器IP -U 用户名%密码
例:#smbclient -L //192.168.1.100/ -U benson%1
登入samba #smbclient //机器IP/共享目录 -U 用户名称%密码
例:#smbclient //192.168.1.100/printers -U benson%1
登入成功后出现提示符 smb:/> ,接下来的操作和ftp时命令一样,用get下载文件而用put上传文件,命令可以用help查看。
我的是Arch Linux的系统,用的xfce4的桌面。
网上的方法是通过编写rules文件用udev来自动挂载,不过rules太复杂了,看了半天没看懂。
我用的方法是安装gvfs,命令:#pacman -S gvfs
然后重启一下系统,现在就可以自动挂载移动硬盘、U盘、光盘了,并且之前一直隐藏的“回收站”也显示了。
在前面的文章介绍了使用Glade进行PyGTK开发,现在再来说一说使用Glade来进行GTK的开发。
首先需要的开发环境:
Glade3、GTK+2.0、GCC
先用Glade设计一个用户界面,保存为test.glade,内容如下:
1 |
|
再创建一个C源文件,保存为test.c,内容如下:
1 |
|
然后再编译运行查看效果。
如果出现类似“Gtk-WARNING **: Could not find signal handler ‘on_MainWindow_destroy’”的错误请尝试以下方法:
方法一:将编译命令改为:gcc -o test test.c `pkg-config –libs –cflags gtk+-2.0` -export-dynamic
方法二:将编译命令改为:gcc -o test test.c `pkg-config –libs –cflags libglade-2.0 gmodule-export-2.0`
我在永中Office下无法调用ibus输入法,但是在其他窗口中都没有问题,如:gVIM,LeafPad,OpenOffice等等。我按照网上的方法在.bashrc文件中也添加了以下内容,可是还是不行。
export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus
正打算更换输入法时无意中发现了问题的所在。
首先用ps -e|grep ibus命令发现只有 ibus-daemon、ibus-gconf两个进程。
然后执行命令/usr/lib/ibus/ibus-x11 &,运行ibux-x11。 这时就有了 ibus-daemon、ibus-gconf、ibus-x11三个进程。此时在永中Office中可以正常使用ibus输入法了。
原来是ibus-x11没有运行的原因,如果不想每次都手动运行的话,可以将它设置为开机自动启动。