• cygwin


    根据cygwin user guide翻译整理,希望对大家有所帮助。有错误清指出。

    1 引言
            cygwin是一个在windows平台上运行的unix模拟环境,是cygnus solutions公司开发的自由软件(该公司开发了很多好东西,著名的还有eCos,不过现已被Redhat收购)。它对于学习unix/linux操作环境,或者从unix到windows的应用程序移植,或者进行某些特殊的开发工作,尤其是使用gnu工具集在windows上进行嵌入式系统开发,非常有用。随着嵌入式系统开发在国内日渐流行,越来越多的开发者对cygwin产生了兴趣。本文将对其作一介绍。

    ---------------------------------------------------------------------

    根据cygwin user guide翻译整理,希望对大家有所帮助。有错误清指出。

    1 引言
            cygwin是一个在windows平台上运行的unix模拟环境,是cygnus solutions公司开发的自由软件(该公司开发了很多好东西,著名的还有eCos,不过现已被Redhat收购)。它对于学习unix/linux操作环境,或者从unix到windows的应用程序移植,或者进行某些特殊的开发工作,尤其是使用gnu工具集在windows上进行嵌入式系统开发,非常有用。随着嵌入式系统开发在国内日渐流行,越来越多的开发者对cygwin产生了兴趣。本文将对其作一介绍。

    2 机理
            cygnus当初首先把gcc,gdb,gas等开发工具进行了改进,使他们能够生成并解释win32的目标文件。然后,他们要把这些工具移植到windows平台上去。一种方案是基于win32 api对这些工具的源代码进行大幅修改,这样做显然需要大量工作。因此,他们采取了一种不同的方法——他们写了一个共享库(就是cygwin dll),把win32 api中没有的unix风格的调用(如fork,spawn,signals,select,sockets等)封装在里面,也就是说,他们基于win32 api写了一个unix系统库的模拟层。这样,只要把这些工具的源代码和这个共享库连接到一起,就可以使用unix主机上的交叉编译器来生成可以在windows平台上运行的工具集。以这些移植到windows平台上的开发工具为基础,cygnus又逐步把其他的工具(几乎不需要对源代码进行修改,只需要修改他们的配置脚本)软件移植到windows上来。这样,在windows平台上运行bash和开发工具、用户工具,感觉好像在unix上工作。
            关于cygwin实现的更详细描述,请参考http://cygwin.com/cygwin-ug-net/highlights.html.

    3 安装设置cygwin
    3.1 安装
            要安装网络版的cygwin,可以到http://cygwin.com,点击"Install Cygwin Now!"。这样会先下载一个叫做setup.exe的GUI安装程序,用它能下载一个完整的cygwin。按照每一屏的指示可以方便的进行安装。
    3.2 环境变量
            开始运行bash之前,应该设置一些环境变量。cygwin提供了一个.bat文件,里面已经设置好了最重要的环境变量。通过它来启动bash是最安全的办法。这个.bat文件安装在cygwin所在的根目录下。 可以随意编辑该文件。
            CYGWIN变量用来针对cygwin运行时系统进行多种全局设置。开始时,可以不设置CYGWIN或者在执行bash前用类似下面的格式在dos框下把它设为tty
    C:/> set CYGWIN=tty notitle glob

    PATH变量被cygwin应用程序作为搜索可知性文件的路径列表。当一个cygwin进程启动时,该变量被从windows格式(e.g. C:/WinNT/system32;C:/WinNT)转换成unix格式(e.g., /WinNT/system32:/WinNT)。如果想在不运行bash的时候也能够使用cygwin工具集,PATH起码应该包含x:/cygwin/bin,其中x:/cygwin 是你的系统中的cygwin目录。
            HOME变量用来指定主目录,推荐在执行bash前定义该变量。当cygwin进程启动时,该变量也被从windows格式转换成unix格式,例如,作者的机器上HOME的值为C:/(dos命令set HOME就可以看到他的值,set HOME=XXX可以进行设置),在bash中用echo $HOME看,其值为/cygdrive/c.
            TERM变量指定终端型态。如果美对它进行设置,它将自动设为cygwin。
            LD_LIBRARY_PATH被cygwin函数dlopen()作为搜索.dll文件的路径列表,该变量也被从windows格式转换成unix格式。多数Cygwin应用程序不使用dlopen,因而不需要该变量。
    3.3 改变cygwin的最大存储容量
            Cygwin程序缺省可以分配的内存不超过384 MB(program+data)。多数情况下不需要修改这个限制。然而,如果需要更多实际或虚拟内存,应该修改注册表的HKEY_LOCAL_MACHINE或HKEY_CURRENT_USER区段。田家一个DWORD键heap_chunk_in_mb并把它的值设为需要的内存限制,单位是十进制MB。也可以用cygwin中的regtool完成该设置。例子如下:
    regtool -i set /HKLM/Software/Cygnus/ Solutions/Cygwin/heap_chunk_in_mb 1024
    regtool -v list /HKLM/Software/Cygnus/ Solutions/Cygwin

    4 使用cygwin
            这一段讲一下cygwin和传统unix系统的不同之处。
    4.1 映射路径名
    4.1.1 引言
            cygwin同时支持win32和posix风格的路径,路径分隔符可以是正斜杠也可以是反斜杠。还支持UNC路径名。(在网络中,UNC是一种确定文件位置的方法,使用这种方法用户可以不关心存储设备的物理位置,方便了用户使用。在Windows操作系统,Novell Netware和其它操作系统中,都已经使用了这种规范以取代本地命名系统。在UNC中,我们不用关心文件在什么盘(或卷)上,不用关心这个盘(或卷)所在服务器在什么地方。我们只要以下面格式就可以访问文件:
    //服务器名/共享名/路径/文件名
            共享名有时也被称为文件所在卷或存储设备的逻辑标识,但使用它的目的是让用户不必关心这些卷或存储设备所在的物理位置。)
            符合posix标准的操作系统(如linux)没有盘符的概念。所有的绝对路径都以一个斜杠开始,而不是盘符(如c:)。所有的文件系统都是其中的子目录。例如,两个硬盘,其中之一为根,另一个可能是在/disk2路径下。
            因为许多unix系统上的程序假定存在单一的posix文件系统结构,所以cygwin专门维护了一个针对win32文件系统的内部posix视图,使这些程序可以在windows下正确运行。在某些必要的情况下,cygwin会使用这种映射来进行win32和posix路径之间的转换。
    4.1.2 cygwin mount表
            cygwin中的mount程序用来把win32盘符和网络共享路径映射到cygwin的内部posix目录树。这是与典型unix mount程序相似的概念。对于那些对unix不熟悉而具有windows背景的的人来说,mount程序和早期的dos命令join非常相似,就是把一个盘符作为其他路径的子目录。
            路径映射信息存放在当前用户的cygwin mount表中,这个mount table 又在windows的注册表中。这样,当该用户下一次登录进来时,这些信息又从注册表中取出。mount 表分为两种,除了每个用户特定的表,还有系统范围的mount表,每个cygwin用户的安装表都继承自系统表。系统表只能由拥有合适权限的用户(windows nt的管理员)修改。
            当前用户的mount表可以在注册表"HKEY_CURRENT_USER/Software/Red Hat, Inc./Cygwin/mounts v" 下看到。系统表存在HKEY_LOCAL_MACHINE下。
            posix根路径/缺省指向系统分区,但是可以使用mount命令重新指向到windows文件系统中的任何路径。cygwin从win32路径生成posix路径时,总是使用mount表中最长的前缀。例如如果c:被同时安装在/c和/,cygwin将把C:/foo/bar转换成/c/foo/bar.
            如果不加任何参数地调用mount命令,会把Cygwin当前安装点集合全部列出。在下面的例子中,c盘是POSIX根,而d盘被映射到/d。本例中,根是一个系统范围的安装点,它对所有用户都是可见的,而/d仅对当前用户可见。
    c:/> mount
    f:/cygwin/bin on /usr/bin type system (binmode)
    f:/cygwin/lib on /usr/lib type system (binmode)
    f:/cygwin on / type system (binmode)
    e:/src on /usr/src type system (binmode)
    c: on /cygdrive/c type user (binmode,noumount)
    e: on /cygdrive/e type user (binmode,noumount)
            还可以使用mount命令增加新的安装点,用umount删除安装点。
            当Cygwin不能根据已有的安装点把某个win32路径转化为posix路径时,cygwin会自动把它转化到一个处于缺省posix路径/cygdrive下的的一个安装点. 例如,如果Cygwin 访问Z:/foo,而Z盘当前不在安装表内,那么Z:/将被自动转化成/cygdrive/Z.
            可以给每个安装点赋予特殊的属性。自动安装的分区显示为“auto”安装。安装点还可以选择是"textmode"还是 "binmode",这个属性决定了文本文件和二进制文件是否按同样的方式处理。
    4.1.3 其他路径相关信息
            cygpath工具提供了在shell脚本中进行win32-posix路径格式转换的能力。
            HOME, PATH,和LD_LIBRARY_PATH环境变量会在cygwin进程启动时自动被从Win32格式转换成了POSIX格式(例如,如果存在从该win32路径到posix路径的安装,会把c:/cygwin/bin转为/bin)。

    cygwin的命令

    基本操作命令:
    ----------------------------------------------------------------------
    ----------------------------------------------------------------------
    ls #以默认方式显示当前目录文件列表
    ls –a #显示所有文件包括隐藏文件
    ls –l #显示文件属性,包括大小,日期,符号连接,是否可读写及是否可执行
    ls --color=never *.so > obj #不显示文字颜色,将所有so文件记录到obj文件中

    ----------------------------------------------------------------------
    cd dir #切换到当前目录下的dir目录
    cd / #切换到根目录
    cd .. #切换到到上一级目录
    cd ../.. #切换到上二级目录
    cd ~ #切换到用户目录,比如是root用户,则切换到/root下

    ----------------------------------------------------------------------
    rm file #删除某一个文件
    rm -fr dir #删除当前目录下叫dir的整个目录

    ----------------------------------------------------------------------
    cp source target #将文件source 复制为 target
    cp /root/source . #将/root下的文件source复制到当前目录
    cp –av soure_dir target_dir #将整个目录复制,两目录完全一样
    cp –fr source_dir target_dir #将整个目录复制,并且是以非链接方式复制,当source目录带有符号链接时,两个目录不相同

    ----------------------------------------------------------------------
    mv source target #将文件source更名为target

    ----------------------------------------------------------------------
    diff dir1 dir2 #比较目录1与目录2的文件列表是否相同,但不比较文件的实际内容,不同则列出
    diff file1 file2 #比较文件1与文件2的内容是否相同,如果是文本格式的文件,则将不相同的内容显示,如果是二进制代码则只表示两个文件是不同的
    comm file1 file2 #比较文件,显示两个文件不相同的内容

    ----------------------------------------------------------------------
    echo message #显示一串字符
    echo "message message2" #显示不连续的字符串
    cat:
    cat file #显示文件的内容,和DOS的type相同
    cat file | more #显示文件的内容并传输到more程序实现分页显示,使用命令less file可实现相同的功能
    more #分页命令,一般通过管道将内容传给它,如ls | more

    ----------------------------------------------------------------------
    export LC_ALL=zh_CN.GB2312 #将环境变量LC_ALL的值设为zh_CN.GB2312
    export DISPLAY=0:0 #通过该设置,当前字符终端下运行的图形程序可直接运行于Xserver
    date #显示当前日期时间
    date -s 20:30:30 #设置系统时间为20:30:30
    date -s 2002-3-5 #设置系统时期为2003-3-5
    clock –r #对系统Bios中读取时间参数
    clock –w #将系统时间(如由date设置的时间)写入Bios

    ----------------------------------------------------------------------
    eject #umout掉CDROM并将光碟弹出,但cdrom不能处于busy的状态,否则无效

    ----------------------------------------------------------------------
    du #计算当前目录的容量
    du -sm /root #计算/root目录的容量并以M为单位
    find -name /path file #在/path目录下查找看是否有文件file
    grep -ir “chars” #在当前目录的所有文件查找字串chars,并忽略大小写,-i为大小写,-r为下一级目录

    ----------------------------------------------------------------------
    vi file #编辑文件file
    vi 原基本使用及命令:
    输入命令的方式为先按ctrl+c, 然后输入:x(退出),:x!(退出并保存) :w(写入文件),:w!(不询问方式写入文件), :r file(读文件file) ,:%s/oldchars/newchars/g(将所有字串oldchars换成newchars) 这一类的命令进行操作

    ----------------------------------------------------------------------
    man ls #读取关于ls命令的帮助
    man ls | grep color #读取关于ls命令的帮助并通过grep程序在其中查找color字串

    ----------------------------------------------------------------------
    startx #运行Linux图形有环境
    Xfree86 #只运行X图形server

    ----------------------------------------------------------------------
    reboot #重新启动计算机
    halt #关闭计算机
    init 0 #关闭所有应用程序和服务,进入纯净的操作环境
    init 1 #重新启动应用及服务
    init 6 #重新启动计算机

    ----------------------------------------------------------------------
    扩展命令
    ----------------------------------------------------------------------
    ----------------------------------------------------------------------
    tar xfzv file.tgz #将文件file.tgz解压
    tar xfzv file.tgz -C target_path #将文件file.tgz解压到target_path目录下
    tar cfzv file.tgz source_path #将文件source_path压缩为file.tgz
    tar c directory > directory.tar #将目录directory打包成不压缩的directory.tar
    gzip directory.tar #将覆盖原文件生成压缩的 directory.tar.gz
    gunzip directory.tar.gz #覆盖原文件解压生成不压缩的 directory.tar。
    tar xf directory.tar #可将不压缩的文件解包

    ----------------------------------------------------------------------
    dmesg #显示kernle启动及驱动装载信息
    uname #显示操作系统的类型
    uname -R #显示操作系统内核的version

    ----------------------------------------------------------------------
    strings file 显示file文件中的ASCII字符内容

    ----------------------------------------------------------------------
    rpm -ihv program.rpm #安装程序program并显示安装进程
    rpm2targz program.rpm program.tgz #将rpm格式的文件转换成tarball格式

    ----------------------------------------------------------------------
    su root #切换到超级用户
    sulogin /dev/tty4 #在tty4即alt+F4终端等待用户登陆或直接登陆开启一个shell
    chmod a+x file #将file文件设置为可执行,脚本类文件一定要这样设置一个,否则得用bash file才能执行
    chmod 666 file #将文件file设置为可读写
    chown user /dir #将/dir目录设置为user所有

    ----------------------------------------------------------------------
    mknod /dev/hda1 b 3 1 #创建块设备hda1,主设备号为3,从设备号为1,即master硬盘的的第一个分区
    mknod /dev/tty1 c 4 1 #创建字符设备tty1,主设备号为4,众设备号为1,即第一个tty终端

    ----------------------------------------------------------------------
    touch /tmp/running #在/tmp下创建一个临时文件running,重新启动后消失

    ----------------------------------------------------------------------
    sleep 9 #系统挂起9秒钟的时间

    ----------------------------------------------------------------------
    lpd stop 或 cups stop #停止打印服务程序
    lpd start 或 cups start #启动打印服务程序
    lpd restart 或 cups restart #重新启动打印服务程序
    lpr file.txt #打印文件file.txt

    ----------------------------------------------------------------------
    fdisk /dev/hda #就像执行了dos的fdisk一样
    cfdisk /dev/hda #比fdisk界面稍为友好些
    mount -t ext2 /dev/hda1 /mnt #把/dev/hda1装载到 /mnt目录
    df #显示文件系统装载的相关信息
    mount -t iso9660 /dev/cdrom /mnt/cdrom #将光驱加载到/mnt/cdrom目录
    mount-t smb //192.168.1.5/sharedir /mnt -o username=tomlinux,password=tomlinux #将windows的的共享目录加载到/mnt/smb目录,用户名及密码均为tomlinux
    mount -t nfs 192.168.1.1:/sharedir /mnt #将nfs服务的共享目录sharedir加载到/mnt/nfs目录
    umount /mnt #将/mnt目录卸载,/mnt目录必须处于空闲状态
    umount /dev/hda1 #将/dev/hda1设备卸载,设备必须处于空亲状态
    sync #将cache中的内容与磁盘同步,在Linux中复制文件,一般要系统空闲才去写文件
    e2fsck /dev/hda1 #检查/dev/hda1是否有文件系统错误,提示修复方式
    e2fsck -p /dev/hda1#检查/dev/hda1是否有错误,如果有则自动修复
    e2fsck -y /dev/hda1#检查错误,所有提问均于yes方式执行
    e2fsck -c /dev/hda1#检查磁盘是否有坏区
    mkfs /dev/hda1 #格式化/dev/hda1为ext2格式
    mkfs.minix /dev/hda1 #格式化/dev/hda1为minix格式文件系统
    mfks /dev/hda9 #格工化/dev/hda9为Linux swap格式
    swapon /dev/hda9 #将swap分区装载当作内存来用
    swapoff /dev/hda9 #将swap分区卸载

    ----------------------------------------------------------------------
    lilo #运行lilo程序,程序自动查找/etc/lilo.conf并按该配置生效
    lilo -C /root/lilo.conf #lilo程序按/root/lilo.conf配置生效
    grub #在Linux shell状态下运行boot loader设置程序
    grub-install #安装grub磁盘引导程序,成功后升级内核无须像lilo一样要重新启动系统,只需修改/etc/grub.conf即可实现新引导配置
    rdev bzImage #显示kernel的根分区信息
    rdev bzImage /dev/hda1 #将kernel的根分区设置为/dev/hda1,这在没有lilo等引导程序的系统中非常重要.

    ----------------------------------------------------------------------
    dd if=/dev/fd0 f=floppy.fd #将软盘的内容复制成一个镜像,功能与旧石器时代常用的hd-copy相同
    dd if=/dev/zero f=root.ram bs=1024,count=1024 #生成一个大小为1M的块设备,可以把它当作硬盘的一个分区来用
    mkfs root.ram #将块设备格式化为ext2格式
    dd if=root.ram f=/dev/ram0 #将init.rd格式的root.ram的内容导入内存
    mount /dev/ram0 /mnt #ramdisk /dev/ram0装载到/mnt 目录

    ----------------------------------------------------------------------
    gcc hello.c #将hello.c编译成名为a.out二进制执行文件
    gcc hello.c -o hello #将hello.c编译成名为hello的二进制执行文件
    gcc -static -o hello hello.c #将hello.c编译成名为hello的二进制静态执行文件
    ldd program #显示程序所使用了哪些库
    objcopy -S program #将程序中的符号表及无用的调试信息去掉,可以小很多

    ----------------------------------------------------------------------
    strace netscape #跟踪程序netscape的执行,看调用的库,环境变量设置,配置文件,使用的设备,调用的其它应用程序等,在strace下,程序干了什么东东一目了然。
    ps #显示当前系统进程信息
    ps –ef #显示系统所有进程信息
    kill -9 500 #将进程编号为500的程序干掉
    killall -9 netscape #将所有名字为netscape的程序杀死,kill不是万能的,对僵死的程序则无效。
    top #显示系统进程的活动情况,按占CPU资源百分比来分
    free #显示系统内存及swap使用情况
    time program #在program程序结束后,将计算出program运行所使用的时间

    ----------------------------------------------------------------------
    chroot . #将根目录切换至当前目录,调试新系统时使用
    chroot /tomlinux #将根目录切换至/tomlinux目录
    chroot /tomlinux sbin/init #将根目录切换至/tomlinux并执行sbin/init
    adduser id #增加一个叫id的用户
    userdel id #增除叫id的用户
    userlist #显示已登陆的用户列表
    passwd id #修改用户id的密码
    passwd -d root #将root用户的密码删除
    chown id /work #指定/work目录为id用户所拥有

    ----------------------------------------------------------------------
    ifconfig eth0 192.168.1.1 netmask 255.255.255.0 #设置网卡1的地址192.168.1.1,掩码为255.255.255.0,不写netmask参数则默认为255.255.255.0
    ifconfig eth0:1 192.168.1.2 #捆绑网卡1的第二个地址为192.168.1.2
    ifconfig eth0:x 192.168.1.x #捆绑网卡1的第二个地址为192.168.1.x
    ifconfig down eth1 #关闭第二块网卡,使其停止工作
    hostname -F tomlinux.com #将主机名设置为tomlinux.com
    route #显示当前路由设置情况
    route add default gw 192.168.1.1 metric 1 #设置192.168.1.1为默认的路由
    route del default #将默认的路由删除
    dhcp #启动dhcp服务
    dhclient #启动dhcp终端并自动获取IP地址
    ping 163.com #测试与163.com的连接
    ping 202.96.128.68 #测试与IP 202。96.128.68的连接

    ----------------------------------------------------------------------
    probe rtl8139 #检查驱动程序rtl8139.o是否正常工作
    lsmod #显示已装载的驱动程序
    insmod rtl8139.o #装载驱动程序rtl8139.o
    insmod sb.o io=0x280 irq=7 dma=3 dma16=7 mpu_io=330 #装载驱动程序并设置相关的irq,dma参数
    rmmod rtl8139 #删除名为rtl8139的驱动模块
    gpm -k #停止字符状态下的mouse服务
    gpm -t ps2 #在字符状态下以ps2类型启动mouse的服务

    ----------------------------------------------------------------------
    telnet 192.168.1.1 #登陆IP为192.168.1.1的telnet服务器
    telnet iserver.com #登陆域名为iserver.com的telnet服务器
    ftp 192.168.1.1 或 ftp iserver.com #登陆到ftp服务

    Linux开发中的常用命令(cygwin环境也同样适用)

     cygwin使用心得
    1.在cygwin里访问Windows盘
    cd /cygdrive/c
    cd c:
    2.整合cygwin命令到Windows中
    假设cygwin安装在d:/develop/cygwin,则将d:/develop/cygwin/bin添加到系统变量PATH中(最好加在windows前面,这样的话,有些相同的命令的话,是先执行cygwin的命令,而不是windows命令,比如find)
    就可以直接在cmd.exe下面执行tar czvf xxx.tgz ./
    基本上所有的命令都可以用了,包括ls,more,less,find,grep等。
    3.使用TGZ备份
    将cygwin的BIN加入到PATH
    建一个BAT文件:
    @echo off
    d:
    cd d:/website/8thmanage
    tar czvf 8thmanage.tgz 8thmanage
    4.Windows使用SHELL脚本
    将cygwin的BIN加入到PATH
    在$CYGWIN的目录/var/下面建一脚本t.sh,注意,t.sh里面的路径,都是相对于$CYGWIN的,里面需要访问C盘的,请用/cygdrive/c/
    在Windows下执行:
    d:/cygwin/bin/bash d:/cygwin/var/t.sh
    (可以定期执行)
    5.同步Windows系统用户
    mkpasswd -l > /etc/passwd
    mkgroup -l > /etc/group
    如果有Domain的话,需要加上-d domainname
    6.安装系统服务
    cygrunsrv
    7.cygwing下使用rsync
    a.安装rsync组件
    b.进入cygwin,配置服务器
    vi /etc/rsyncd.conf
    ...screts file=/etc/tom.ipaddr.pas
    配置文件,参考我写的另外一篇rsync的文章,注意:密码文件权限必须是0400
    chmod 0400 /etc/tom.ipaddr.pas
    c.启动服务端
    rsync --daemon
    d.客户端同步
    在客户端的cygwin下面,运行rsync同步,具体命令,请参考另外一篇rsync的文章。
    8.cygwin下使用SSHD
    a.需要安装了cygrunsrc,openssh
    b.运行ssh-host-config -y
    一路回车,直到出现CYGWIN=时,输入tty ntsec,再回车,
    (或者,增加一系统环境变量CUGWIN=nesec tty)
    c.已经安装好SSHD服务到你的Windows服务中,可以直接在服务中启动,关闭。
    (cygrunsrc -S sshd或者net start sshd)
    9.中文显示
    vi ~/.bashrc
    # 让ls和dir命令显示中文和颜色
    alias ls='ls --show-control-chars --color'
    alias dir='dir -N --color'
    # 设置为中文环境,使提示成为中文
    export LANG="zh_CN.GBK"
    # 输出为中文编码
    export OUTPUT_CHARSET="GBK"
    ~/.inputrc为
    set completion-ignore-case on
    set meta-flag on
    set output-meta. on
    set convert-meta. off
    cygwin.bat脚本为:
    @echo off
    set MAKE_MODE=UNIX

    --------------------------------
    安装
    可以直接到http://www.cygwin.com下载一个安装程序,setup.exe,这个程序只是一个安装程序,所有的模块将从网络下载安装。或者,你可以下载一个cygwin.iso的镜像,直接映象成光盘,再从光盘本地安装,这样会快很多,而且不用考虑断线的问题。

    X下的中文支持
    locale支持
    Cygwin的locale支持一直都有问题,好在X程序还可以使用XLOCALE。
    建议还是使用zh_CN.gbk, 不要使用zh_CN.GB2312
    在移植程序时需要注意不要让程序连接libcygwin.a里面的setlocale,而是采用libX11.a里面的_Xsetlocale。方法是:检查被移植程序的全部源代码,发现
    #include
    就修改为
    #define X_LOCALE
    #include
    同时注意程序的连接库要添加-lX11.
    如果对于结果没有把握,可以找个Dependency Walker查看程序是否连接到了cygwin1.dll里面的setlocale,如果是,就说明有遗漏。
    中文字体
    PCF点阵字体
    GTK1.x 和其他一些老的X程序都是用X字体,
    注意必须要有编码与locale一致的字体,比如用zh_CN.gbk就必须要由GBK编码的字体,用zh_CN.GB2312就必须要有GB2312编码的字体
    如果使用zh_CN.GB2312,这里有一个RedOffice面带的点阵字体包
    可以采用ttf2bdf从TTF抽取得到bdf格式,然后再用bdf2pcf得到pcf格式的字体文件。
    (这里有一个Windows版本的TTF2BDF,可以将Windows TTF字体转换出BDF字体, 注意得到bdf后要手工编辑一下文件头,将编码声明修改正确)

    到字体之后,放到某个目录下,执行mkfontdir生成fonts.dir,然后用xset +fp
    /path/to/your/fonts将字体路径加入即可(注意与fontconfig的配置不同,这里路径是不递归的,如果有的字体放在子目录里面,
    子目录也需要添加进去才行)。

    TTF字体
    很多新的应用程序(比如GTK2)都使用fontconfig/libxft2来显示字体,它对TTF字体的支持比较好(X以前通过freetype, xft模块也支持TTF字体,但对中日韩字体的支持不是太好,而且也在Cygwin下似乎也没有这些模块)
    完全可以使用Linux下的arphic字体包. 如果没有安装Linux,可以到http://packages.debian.org下载相应的包,然后用7zip解压提取出ttf文件。
    得到字体文件之后,放到某个目录之下,编辑/etc/fonts/local.conf,将字体路径加入:
    /path/to/my/ttf/fonts如果只是自己使用,可以将字体文件放到~/.fonts下,不需要修改任何配置,最多三十秒fontconfig就能够发现这些字体了。

    中文输入法
    老黄(hzhr)移植了miniChinput到Cygwin,我也移植了fcitx-1.8.5和3.0,均可以从我的网站上找到http://www.oliwen.com/bama...
    一般设置了LC_CTYPE和XMODIFIERS就可以在程序中激活输入输入法了(除非这个程序没有XIM支持):
    LC_CTYPE=zh_CN.gbk
    XMODIFIERS="@im=Chinput"
    export LC_CTYPE XMODIFIERS
    对于fcitx而言,XMODIFIERS设置为什么都可以(但必须要设置),所以设置为"@im=Chinput"的话chinput和fcitx都可以正常使用
    VI中的 Backspace 與 Delete 按鍵異常
    首先確定 $TERM的設定為cygwin

    echo $TERM

    若不是,請設定為

    TERM = cygwin
    export TERM

    Backspace 與 Delete這兩個鍵正常狀況下只有一個有用。可在 $HOME/.bash_profile 任選一個來使用

    stty erase '^H' //ctrl+v, ctrl+h

    stty erase '^?'

    本文来自: 脚本之家(www.jb51.net) 详细出处参考:http://www.jb51.net/article/6236.htm

    2008-04-14 22:17

    1. 资源

    1.1. 网址链接

    • 主页:
    http://www.cygwin.com/
    • 同步:
    ftp://ftp.sunsite.utk.edu/pub/cygwin/release/
    ftp://anonymous:cygwin@ftp.gnupilgrims.org/pub/cygwin/release/

    1.2. WIKI 关键字

    2. 版本

    3. FAQ

    3.1. Q Howto get version info?

             bash$ cygcheck -c cygwin

    3.2. Q 安装注意事项

    • gzip
    gzip 版本 1.3.3-4 可用。高版本如: 1.3.5-1 使 tar -z 命令运行不正常。

    3.3. Q Howto setup default text format, CRLF(dos) or LF(unix)?

    • 修改注册表项:HKEY_LOCAL_MACHINE/SOFTWARE/Cygnus Solutions/Cygwin/mounts v2/.../cygdrive flags。 cygdrive flags是一个DWORD值,&0x2 == 0x2 为 Unix Style,否则为 Dos like style。
    • 设置环境变量 CYGWIN, 使得在 pipe 等模式下的处理方式:export CYGWIN=nobinmode

    3.4. Q 为什么在 Cygwin 下创建的文件,其他管理员不可写?

    这是所谓的 ntsec 在起作用。通过 NTFS 的权限设置,模拟 UNIX 的权限。可以通过 CYGWIN 环境变量修改。如:
             bash$ export CYGWIN="nontsec nosmbntsec"

    3.5. Q 如何让 ls 能够显示中文文件名?

    因为 ls 不使用 readline 来显示, 因而不能用 .inputrc 控制。即 less 和 ls 需要特别设置。在 .bashrc 中加入如下 alias:
    alias less='/bin/less -r' alias ls='/bin/ls -F --color=tty --show-control-chars'

    3.6. Q 如何在按 TAB 键进行文件名扩展时忽略大小写,这样在 Windows 下才方便噢?

    参见:[Cygwin User's Guide]

    Customizing bash

    Three initialization files that control the behavior. of bash: .profile, .bashrc and .inputrc.

    .profile

    It is executed when bash is started as login shell, e.g. from the command bash --login.

    建议

    • 在 PATH 后加上 ":.",这样可以象在 DOS 下,执行本目录下程序;

    .bashrc

    .bashrc is similar to .profile but is executed each time an interactive bash shell is launched.

    .inputrc

    .inputrc controls how programs using the readline library (including bash) behave.
    # Ignore case while completingset completion-ignore-case on# Make Bash 8bit cleanset meta-flag onset output-meta. on # to show 8-bit charactersset convert-meta. off # to show it as character, not the octal representation

    但是并不能保证 ls 显示中文。因为这些工具不使用 readline 来显示。象 less 和 ls 需要特别设置。在 .bashrc 中加入如下 alias:

    alias less='/bin/less -r' alias ls='/bin/ls -F --color=tty --show-control-chars'

    3.7. Q 如何在 Cygwin 中运行 crontab?

    如下:
    • 在Windows上安装系统服务 cron,开机即运行。
             bash$ cygrunsrv -I cron -p /usr/sbin/cron -a -D
    • 启动服务
             bash$ cygrunsrv -S cron

    3.8. Q 配置 SSH client?

    • 为了能够通过公钥验证进行SSH登陆其他服务器,先要在本地建立 SSH 公钥私钥对:
             bash$ ssh-keygen -t rsa1         bash$ ssh-keygen -t rsa         bash$ ssh-keygen -t dsa
    • 建立无口令登录
    需要将本机的 *.pub 拷贝(cat>>)到服务器中 $HOME/.ssh/ 下的 authorized_keys (ssh1) 和 authorized_keys2 (ssh2) 文件中去。

    3.9. Q 如何在 cygwin 中运行 sshd (SSH Server)?

    如下:
    • 设置 Windows 环境变量,添加“CYGWIN = ntsec tty”
    • Config SSHD, running:
             bash$ ssh-host-config -y
    根据提示,输入 CYGWIN=ntsec tty
    • Change permissions and ownership on some files:
             bash$ cd /; chmod -R og-w .          bash$ chmod og+w /tmp          bash$ touch /var/log/sshd.log          bash$ chown system:system /var/log/sshd.log /var/empty /etc/ssh_h*          bash$ chmod 755 /var/empty
    • start the service:
             bash$ cygrunsrv -S sshd

    3.10. Q 如何在 cygwin 中配置 Email?

    As follows:
    • ssmtp & mutt
      • ssmtp
               bash$ /usr/bin/ssmtp-config
      When using mutt as the mail client, add the following line to your $HOME/.muttrc file:
               set sendmail="/usr/sbin/ssmtp"
    •  
      • mutt
        • Make sure you have the Cygwin ssmtp package installed
        check file /etc/ssmtp/ssmtp.conf
        • vi .bashrc and/or .bash_profile
                 export MAIL=~/Mail/inbox         export EDITOR=nano
        If you have nano installed (and I stongly recommend that you do)
        • Create the following directory structure in your HOME directory:
                 ~/Mail            |            -- inbox (EMPTY FILE, NOT DIRECTORY)            |            -- sent (EMPTY FILE, NOT DIRECTORY)            |            -- received (EMPTY FILE, NOT DIRECTORY)            |            -- postponed (EMPTY FILE, NOT DIRECTORY)
        • Create a ~/.muttrc file that looks like this:
                 # The file/directory where your incoming mail will be spooled to         # (same as 'set spoolfile' below)         mailboxes ~/Mail/inbox                 # Mail account setup.   I know nothing about IMAP, so you're         # on your own there.         set sendmail="/usr/sbin/ssmtp"         #set pop_host="your.pop3.mail.server.com"         #set pop_last=yes         #set pop_user="your_email_username"         #set pop_pass="your_email_password"         set from="your_complete@email_address.com"                 # Mail folder setup.         set folder=~/Mail         set mbox_type=mbox         set spoolfile=+inbox         set mbox=+received         set postponed=+postponed         set record=+sent
    •  
      •  
        • mutt command line
                 mutt [...] address         参数:             -a file : attach a file to message             -b address: BCC             -c address: CC             -F muttrc             -H draft: draft contain both header and body             -s subject: subject of the message             -x : emulate the mailx compose mode                 环境变量:             EMAIL : user's email address             MAIL   : user's spool mailbox         示例:             bash$ echo "contents" | mutt -x -s "subject" mail@address             bash$ echo   | mutt -x -s "subject" -i filename mail@address
    • exim & minires
      • exim
           Exim is a fully featured mail transfer agent, a drop-in replacement for sendmail.         bash$ /usr/bin/exim-config         bash$ view /etc/exim.conf          bash$ vi /etc/aliases                   postmaster: your_login_name         bash$ vi /etc/reslov.conf                   nameserver 10.0.0.7                   search your.domain         bash$ cygrunsrv -I exim -p /usr/bin/exim -e CYGWIN=nontsec                      -a "-bdf -q15m" -d "Exim Mail Transfer Agent"                    -1 /var/log/exim/cygrunsrv_out.log -2 /var/log/exim/cygrunsrv_err.log         bash$ cygrunsrv -S exim

    3.11. Q 如何得到 Dos/Windows?格式的路径名?

             bash$ cygpath -d -m "`pwd`"

    3.12. Q Setup Xinetd

    • start init service
             bash$ /usr/bin/init-config
    • chkconfig 工具用来维护 /etc/rc.d 下的脚本
      • 若要启动 sshd 执行 "/sbin/chkconfig --add sshd"
    • xinetd config
             bash$ /usr/bin/xinetd-config

    3.13. Q other command?

    ttcp, netsnoop

    3.14. Q XFree86 under Cygwin?

    • add /usr/X11R6/bin to PATH;
    • start Xwindow using startxwin.bat(dos/windows), or startxwin.sh(cygwin);
    • if has a firewall installed, open port "6000" of local server;
    • run xclient in local machine, just set environment: export DISPLAY=127.0.0.1:0.0
    • if run xclient in remote machine, give authorize to remote host:
    bash$ /usr/X11R6/bin/xhost remote_hostname_or_ip_address
    • telnet/ssh to remote host;
    • set environment DISPLAY, like: export DISPLAY=<IP_of_Cygwin_XFree86>:0.0
    • xterm

    3.15. Q 安装后的设置综述?

    • binmode or textmode?
    执行 mount 命令,如果不是 textmode,修改注册表 HKEY_LOCAL_MACHINE/SOFTWARE/Cygnus Solutions/Cygwin/mounts v2/.../cygdrive flags。 cygdrive flags是一个DWORD值,&0x2 == 0x2 为 Unix Style,否则为 Dos like style。
    • 修改 ~/.inputrc 文件,加入如下内容
    # Ignore case while completingset completion-ignore-case on# Make Bash 8bit cleanset meta-flag onset output-meta. on # to show 8-bit charactersset convert-meta. off # to show it as character, not the octal representation
    • 修改 /etc/profile, 加入如下内容:
    set -o vialias less='/bin/less -r'alias ls='/bin/ls -F --color=tty --show-control-chars'# glob filenames in a case-insensitive mannershopt -s nocaseglobexport SGML_CATALOG_FILES=/share/catalog.sgmlexport XML_CATALOG_FILES=/share/catalog.xmlexport CYGWIN="nobinmode nontsec nosmbntsec"export PATH=$PATH:.
    • 修改登录用户的主要组:
             bash$ vi /etc/passwd
    默认属于 513 组(对于域控制器是Domain Users,非域控制器为 NONE),个人偏好设置为 544(Administrator)
    • 建立 symbol link:
      • 因为一些脚本默认的 md5 摘要程序是 md5, 而非 md5sum;
               bash$ ln -s /usr/bin/md5sum /usr/bin/md5
      • 设置 DOCBOOK DTD/DSSSL 路径
               bash$ ln -sf /cygdrive/e/HOME/WORK/johnson_homepage/worldhello/share /share
    •  
      • 设置 usemodwiki 路径映射
      mkdir /reposcd /repos/ln -s /cygdrive/d /dln -s /d/HOME/WORK/johnson_homepage/worldhello/usemod JohnsonUseModWikiln -s /d/HOME/WORK/johnson_homepage/worldhello/wiki .
    •  
      • 设置建立工作路径
               bash$ ln -sf /cygdrive/e/HOME/WORK/ ~/work
      在cygwin中输入中文和显示中文
      2008-07-31 15:45

      cygwin的缺省环境是不支持中文输入和显示的,通过google找到了能人介绍的解决方法。

      中文输入需要修改“.inputrc”文件,只要包括以下语句即可:

      set meta-flag on

      set convert-meta. off

      set output-meta. on

      set input-meta. on

      set completion-ignore-case on

      在我使用的cygwin环境中的“.inputrc”文件中已经包括这些指令了,只是被置成注释语句了,只要删掉行首的“#”就可。

      显示中文需要修改“.bashrc”文件,加入一行:

      alias ls='ls --show-control-chars --color=auto'

      文件修改完毕后,重新启动cygwin就可以看到效果了。

  • 相关阅读:
    C语言实现时间差、星期、天数算日期(转)
    windbg 源码调试设置
    Windbg调试命令详解
    突破session 0隔离 和 劫持exe注入(转自梦无极)
    debug : StartService failed, getlasterror = 0x7f(127) 转
    反调试技巧总结-原理和实现
    关于Win7 x64下过TP保护(内核层)(转)
    python将dict中的unicode打印成中文
    Python 获取接口数据,解析JSON,写入文件
    python提取网页中json数据
  • 原文地址:https://www.cnblogs.com/endv/p/7674720.html
Copyright © 2020-2023  润新知