流缓冲影响父子进程通讯的问题

a.k.a 《在 C 程序中禁用管道中 stdout 的流缓冲》

注意,本文中代码使用了 C99 特性,如声明 for 循环控制变量和 VLA 数组;同时使用了 GNU 的扩展。请使用 -std=c99 -D_GNU_SOURCE 编译。

最近,盖子正在重写服务器上的 php-loop 工具。这个工具的作用的不断重复运行一个程序。叫 php 的原因,是因为最初(也是现在)的需求是用来不停地运行 php-cgi,防止它死掉导致服务中断。

由于时常有人通知盖子虚拟主机上的 php-cgi 出错,因此日志是十分重要的。然而,php-cgi 打印的日志没有时间戳,因此,盖子的 php-loop 必须能够对 php-cgi 的输出做一点处理。

这种需求一点也不新鲜,思路自然从这里开始 —— fork() 出一个子进程去处理一些事情,并把随时把进展通过管道告知父进程。

然而,将这种方法扩展到 execvp 后,却发现由于 stdout 的流缓冲,无法及时获得输出信息。

阅读更多…

Arduino 开发环境在 Gentoo/Systemd 下的搭建

虽说 Gentoo 下的嵌入式开发,有着 Crossdev 神器,避免自己粗制滥造工具链,使最纠结的交叉编译问题消失。但是,今天入手 Arduino Uno,搭建开发环境的时候,还是遇到了太多问题。尤其是我使用 Systemd,导致了更多 Bugs 发生。

本文对我配置开发环境的过程,和可能的错误、陷阱的解决方法,一一记录。

阅读更多…

令人纠结的代码重用

比尔盖子用了 GNU/Linux 之后才真正学了一些编程,才知道“代码重用”的概念,也就是大家口口声声说的“不要重复发明轮子”。例如,别人已经编写了解决问题的工具,就不要自己重新发明,除非遇到问题。例如,自己在 Ruby 里实现 base64 算法实在是愚蠢。

Unix 利用管道和 Shell 脚本,充分发挥了代码重用的优势 —— 只需要把各个 Unix 里的程序 —— 多半还是 C 语言写成的 —— 串起来,就可以完成复杂的任务,这也叫做充分利用软件开发的杠杆效应。

但是,前一种代码重用是在程序内部发生的,后者则是在程序外部。如果后者发生在脚本中,是非常方便的,但如果发生在程序中,则是一个非常棘手的问题。例如,我正在编写一个 C 程序,需要进行一个正则匹配,而 grep 正好完美的实现了我的需求(也就是不考虑其它库),这时该怎么做?

  • 模仿 grep 的行为(可查阅源代码),编写函数 grep()
  • 在程序中调用 grep
  • 将 grep 的匹配算法独立为库 libgrepgrep 和其它程序均可使用
  • 增加一个 grep 的系统调用
  • 使用 Perl

如果你是使用第一种方法,那么根本不算代码重用,即使你从 grep 的实现中复制了大量源代码也不例外;在程序中调用外部程序是不稳定的 – 如果你试图在一个 C 程序里调用外部程序,你就会明白,程序要考虑到数种意料之外的情况 —— 尽管使用带有 sh 模块的 Python 可以大大简化编程;而第三种方式看起来是最为完美的,但是,有多少程序是这么实现的呢?增加系统调用看起来很完美,但系统调用可不是 C++ STL 之类的类库。

如果我们使用 Perl,我们就会发现 Perl 里内置一个 grep,还比较好用。但是,Perl 的 grep 和 GNU Coreutlis 的 grep 毫不相关,实际上只是名字一样,行为很像而已。

也就是说,如果要充分重用代码,那么必须:

  • 使用对外部程序调用友好的语法,利用管道(我不会 Perl,我不知道 Perl 做的如何)
  • 每个程序将算法实现独立成库
  • 使用 Shell 编写所有高层建筑

再想想,C++、Python、Perl、PHP、Ruby,哪个程序没有把基本算法重新实现一次呢?在未来,还真的有必要吗?

这个问题在未来肯定还会纠结下去的,尽管在实际开发中,这个问题的影响并不大。不过,Windows 非常完美的解决了这个问题,因为 Windows 的 CLI 程序,没什么值得重用的。另外,顺便胡说几句,不知道这个问题到了真正的微内核操作系统上会不会这么得到解决 —— 每次程序可以把自己的一个函数“注册”成一个系统调用,以服务的方式运行,其它程序就可以方便的调用了 —— 然而我很快就找出了这个想法中的更多问题。

对《关于 yum 作者去世引发的地震》一文的澄清与道歉

因为我对社区缺乏了解,看到 IRC 一些发言,不了解发言者,再加上我不去论坛了解事件前因后果,导致我对收集到的不完整信息的基础之上,又对其作出的错误解读 。进行了造谣传谣的行为,对 openSUSE/Arch/Gentoo 社区造成严重影响而不自知,按照社区负责人的要求,撰写本文,消除谣言造成的影响。

2013 年 7 月 10 日,yum 作者 Seth Vidal 去世。随后我看到了 #kde-cn 上的一些讨论。在忽略了发言者的发言背景的情况下,对其意解读错误。而且,我在明知 microcai 反对 Python,说的话不应当真,却在发文时也没有增加任何说明,误导大众,是非常不合规的。同日晚,我看到了更多对此的讨论。但此时,我在对论坛上的事情完全不了解的情况下,胡乱理解了这些讨论。

7 月 12 日 21:18:06,我看到了某成员在某讨论组上发送了一些 XMPP 日志截图,这些截图是经过断章取义,严重扭曲的,而且按照他的口气,openSUSE 社区内部似乎发生了严重的冲突。但所以“大冲突”都是莫须有的,事实上,是他扰乱了社区的秩序。

而我在对一切完全不查证的情况下,又将其严重错误认为是社区现状附在文尾,严重放大了不良事件的影响。

对此,向 openSUSE (marguerite), Gentoo(microcai), ArchLinux(phoenixlzx)中文社区以及负责人道歉!并保证,来自不再发送未经查证的信息,以防止我再次造谣。

2013 年 07 月 13 日 星期六 01:42:36 CST

GPG: 717E3FB8
Message: 向 openSUSE (marguerite), Gentoo(microcai), ArchLinux(phoenixlzx)中文社区以及负责人道歉!   

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.19 (GNU/Linux)

iQIcBAABAgAGBQJR4D9WAAoJEDF0Xaxxfj+4DKIP/0b5HHGm8DOfI4e+r0g6+Mcz
VFo2JnIJGMgicS+5TFO/8a4mqBgum4emJA0juQcdRCn1t3bXdSMyAuhojmIuT9Ga
x23qSaFcxX6WG76FCDT8qtL7eJ2/UbBkfHTmWYr+Hd8SPO/SNhSHX1x05Ksrtqg3
B1yFIZvcZGhDjzKupfiBNQWw/CXCOaJb8DcvT2C4GLRkIlQFXnJHunzmmEbbRsWl
PZh7EY28xlQ2NdCaeAsR0C0VO5RlYDtKyrWPiltZLmm+bWFKJhGLLGWdD2gStFR0
00dXN9AkAg8cQCkc7zvRXQ6RfGo+y6QynEKGSRYgK9nolqR2P3AwVgAFn7hHLpIR
zj3g8MZF0er4gHi+VA4I1M/q9G0fGEGwrbBJEv1bI0QmbRalfogFGiCpBGHIe66Y
RjdCnXqZaNXTMSNxtIb8dGFri8FRfm3Ir86mqaYqTEyqTqNryUO9rquyvPeYaEsS
7QHbDVLNMP3qsuPG3fTZmPjRDba0R/vc4Cf+TG32AHW20/2hhUpOLTPKgJxO4PID
MlTSGH4tjrcqHH8j8a1Hy2EvS2xf6F+HauARKP45aNUzy/3JsW/0bxqCG2yysOTo
90gw2mcRnhM3Tf51YOcjlKk5S84s1DbRnDz+8dFcLHoh+JUvKNeM36tuPVjWHctN
dQ9wjZ4chpYqi1nxw3qh
=Q3pf
-----END PGP SIGNATURE-----

清除并禁用 MySQL 的 Binary Logs

最近 MySQL 一下子飞黄腾达了,Binary Log 吃掉 800 MiB 多的硬盘空间,干扰了系统的正常运行。解决的方法有很多,包括直接删除文件,逐个使用 SQL 语句清除日志等。但我还是倾向于使用标准的操作方法。
阅读更多…

服务器 IP 变更

由于众所周知的原因,服务器 IP 地址现变更为 106.187.38.29,SSH 端口变为 22000。如果您在使用虚拟主机,请及时变更相关 IP,以免影响到您的正常使用。

虚拟主机迁移

曾经比尔盖子的虚拟主机是 Gentoo,后来为了有管理面板,变成了 Ubuntu。但是,管理面板等一系列复杂的东西使系统性能下降,复杂度提升。最终又换回 Gentoo,并使用自己开发的一套命令行脚本管理用户。

这次的主机增加了不少新特性,包括允许修改 Nginx 配置和用户开机脚本。

dotme.tk 和 235go.com 由于长期不使用已经被我关闭账号。如果有人的账号无法登录了,或者账号被关,请及时联系我,取回文件或者继续使用主机。

软件开放自由的文字游戏

这几个词的混用问题,已经存在了 10 年之久。任凭自由软件基金会,开源软件基金会如何费尽口舌的解释,很多人仍然对这些概念不求甚解。

阅读更多…

树莓派搭建 PPPOE 无线路由器

注意:由于比尔盖子实现早已配置好树莓派,并没有对文中的方法进行逐步确认,因此比尔盖子不对文章内容的正确性负责! 树莓派恐怕是 2010 年的年度电子产品了,它完整的 ARM 架构、足够底的价格和足够小的体积,使它的功能迅速变得无限可能。对于家庭用户来说,把它变成一个可以运行很多守护服务的路由器是个不错的主意。

本文将讲述在没有显示器的情况下仅仅通过网络,将运行 Arch Linux 的树莓派变为路由器。 阅读更多…

反网络流量分类技术

伊朗今年初升级了其防火墙系统,使用了基于论文《网络流量分类研究进展与展望》的最新技术,有效的将加密流量和明文流量区分开,并对任何加密流量给予屏蔽。例如,OpenVPN 的协商会被刺探出来,并被连接重置。我的一台服务器 IP 还因为多次连接被彻底封死。

不过所幸的是,Tor 项目今年刚刚推出了一个叫做 obfsproxy 的试验性项目,可以将加密流量进行混淆,变为看上去像明文的流量,从而干扰网络流量分类系统的正常运转。

本文假设你是一个 OpenVPN 服务器的管理员,具有相当的 OpenVPN 架设经验。我不会将所有的步骤和命令一条一条写出来。

阅读更多…

服务器君用了 0.337 秒钟,查询了 31 次数据库(17 次被缓存),消耗了 10.67MB 内存,努力为您呈现了这个页面。