'Unix/Linux' Category

  • Unix单实例后台守护进程的“规范方法”

    June 2, 2009

    此前的笔记《Linux程序已运行实体的检测以及其PID的获得》通过Linux里面的bash命令来获取正在运行的同名进程的pid,正如网友AzureSky提醒说实际上平常此类程序所用的方法都是文件锁,比如dhclient、apt-get系列、pacman诸如此类,都是通过往/var/run里面写入一个包含自身pid的xx.pid文件,同时加上排他锁,只要当前进程还在,新的进程就不可能再加锁,也就能检测出是否单实例了。(AzureSky博客另外整理出APUE的一个实现) 至于后台运行,都是通过fork来生成新进程,虽然还需要setsid等的调用以确保子进程正常运行,不过这里暂不详细讨论,重点关注文件排他锁和生成的后台进程的“规范方法“(参考《Unix环境高级编程 APUE 第二版》)。 整个过程是这样的: 打开文件; 获得该文件的锁的状态; 如果没有锁,则给该文件加上自己的锁并写入自己的pid*;否则获得锁着该文件的进程的pid 如果能够顺利加上锁,则生成子进程;子进程等待父进程退出后马上给文件加上自己的锁; *其实写不写入pid对整个过程影响不大,只是惯例如此。 过程并不复杂,纠结的地方就是,文件锁是针对进程而言的,在生成后台进程的过程中,父进程和子进程虽然说拥有共同的文件描述字之类的资源,但由于是两个完全不同的进程,文件锁并不会继承过去。只有当父进程完全退出,失去对文件的锁操作后,子进程才能重新获得锁。 文件锁的调用fcntl函数的cmd参数里面有F_SETLK和F_SETLKW两个,后者是阻塞式的调用,就非常适合上述子进程等待父进程退出以获得锁的情形。 PT根据《APUE 2nd》F14.5、F14.6 整理出来的一份示例代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 [...]

  • Arch笔记之:U盘中文乱码

    June 1, 2009

    似乎装了HAL的Arch就能自动挂在U盘了,然而U盘目录里面的中文文件全部是???,很明显是编码问题。我用的是en_US环境,不知道有没有关系。 网上不少说法是修改/etc/udev/rules.d/里面的挂载规则,抄了别人的脚本试了下,很不完善,删掉。 本来就能自动挂载了,只是编码问题而已,应该不用改rules吧!重新以编码问题搜索,终于看到解决方案: 运行gconf-editor(类似Win的注册表编辑器的东东,没有就装上),在System->Storage->vfat的mount_options里面添加一条“iocharset=utf8”,好,大功告成!

  • Linux程序已运行实体的检测以及其PID的获得

    May 25, 2009

    程序中经常需要有这么一个功能:只允许本程序的单个实例运行,即不能多次运行一个程序。检测某个进程是否在运行,在shell中可以很轻松的用命令ps -A|grep xxx找出来,但对于程序来说,该怎么检测呢?我参考了aecium程序的方法:同样调用ps -A|grep xxx。也许会存在更先进的方法,比如dbus、系统信号量之类的技术,总之这个不会是最好的方法,不过且看看其技巧。 首先要获得当前进程的名字以便传给grep,一般通过main的argv[0]可得到运行时的程序名,不过要注意的是,通过路径运行的程序如./a.out,argv[0]也是./a.out的。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 [...]

  • 玩转libnotify

    May 22, 2009

    Ubuntu 9.04一个特性就是新的通知机制Notify OSD,让人一眼看上去很酷的样子,其实只是基于libnotify的调用,别看又DBUS又OSD那么复杂,其实一点都不神秘,跟PT来: 1 2 3 4 5 6 7 8 #!/usr/bin/python #coding:utf-8   import pynotify   pynotify.init ("PT-Title") n = pynotify.Notification ("PT的贺电", "PT再次发来贺电") n.show () 没看错,就是这么几句Python,保存成文件运行试试: 哈哈,很简单吧! 如果你安装了libnotify-bin包,shell里面会有notify-send这个工具: notify-send "PT的贺电" "PT发来贺电" 差不多的效果,我就不抓图了,自己试试! 当然除了python,libnotify还能在很多种语言的库实现,我用aptitude search libnotify搜索了一下,很明显有libinotify-ruby,libnotify-dev,libnotifymm-dev分别是ruby、C、C++方式的绑定,不过,python的pynotify是Ubuntu 9.04里面默认安装的呢…… 详细的开发还是看看Ubuntu的Notification Development Guidelines吧,注意在后部分有很多example的噢!!!

  • ZDClient 0.5版发布

    May 22, 2009

    改善DHCP模式下的认证IP处理方法:若程序能够从网卡获得IP,则使用网卡的真实IP只有获取不到IP时才使用伪IP 169.254.216.45 在使用伪IP的情况下,当接受到第一个REQUEST IDT KEEP ALIVE报文后,尝试再次获取网卡IP与MASK并写入RESPONSE数据帧缓冲区替换伪IP,之后发出的RESPONSE数据帧将包含真实IP 只有当用户同时指定了IP和MASK才使用用户设定值,否则由程序处理IP 修正一些stderr、stderr的滥用 使用起来应该没太大变化,只是让协议更接近官方客户端的过程。现在主页上同时有二进制包和源代码包下载。 项目主页:http://code.google.com/p/zdcclient/ 连续一个星期每天一个版本,= .=有点不可思议的说……

  • ZDClient升级到0.4,完善DHCP模式的认证

    May 21, 2009

    神州数码客户端ZDClient升级到0.4,完善DHCP模式的认证 经过跟武汉大学的michel同学不断的折腾和测试,终于搞清楚他们学校动态DHCP的流程了,“Windows启动后,提示本地连接受限”,到认证后才开始获取IP,这才是动态DHCP模式,所以使用ZDClient的dhcp后,需要运行系统的DHCP客户端重新获取一次IP(通常是dhclient),这一点功能在启动脚本dhcp_zdc_run.sh内已经包含。 现在在Google Code上面的项目已经正式启动,终于用上svn的服务器了,不用把桌面搞的一团糟。 大家可从项目主页下载最新的源码包:http://code.google.com/p/zdcclient/ 之前的网盘链接已经作废。 特别感谢一下刘群同学的关注,给我编译i386的binary,我似乎终于搞定在amd64使用32位的包了!

  • 神州数码客户端ZDClient升级到0.3,支持武汉大学的校园网

    May 20, 2009

    0.3更新-客户端默认版本号更新为3.5.04.1013fk-修正对SUCCESS数据包的识别-后台运行改为在认证成功后主程序返回-根据状态区分用户名、用户配置信息错误与密码错误的两种提示-在接收和发送Keep Alive报文时提示当前线程的pid-改善pcap的抓包过滤器,只抓发往本机的报文 在姚老大的群里面找到武汉大学的同学micheal帮忙测试了ZDClient,昨天晚上把他们的官方客户端的数据包抓了过来看,原来版本是3.5.04.1013fk,比我们的新!不过奇怪的是广州大学的认证服务器除了用户名密码别的似乎什么都不认证,我怎么乱填都能认证成功 = .= 顺便提醒一下武大的同学,记得在zdcrun里面加上--dhcp参数…… 大家可从项目主页下载最新的源码包:http://code.google.com/p/zdcclient/

  • 神州数码客户端ZDClient升级到0.2

    May 19, 2009

    今天对比了官方拨号器的报文,改进了一下包分析流程。广州大学的方案似乎做很少校验,有些东西乱填都照样能过。同时也把协议版本修改到3.5版本的,之前在Wiki页有武汉大学的同学求助说他们学校的神州数码因为3.5的版本校验没法使用姚琪的版本,在这里召唤武汉大学的同学来帮忙测试ZDClient了,哈哈。 0.2 更新-整理代码-进一步完善包解析、发送过程细节,加入遇到为止包时的提示-区分EAP_RESPONSE_IDENTITY和EAP_RESPONSE_IDENTITY_KEEP_ALIVE发送的包-加入自定义客户端版本号的功能参数--ver,并能校验版本号长度-默认版本号改成3.5.04.0324-修改--help内About ZDClient的文字-在认证是提示协议版本信息-增加可检测root权限的启动脚本 大家可从项目主页下载最新的源码包:http://code.google.com/p/zdcclient/

Page optimized by WP Minify WordPress Plugin

 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org