比尔盖子 博客

Category: Linux (page 2 of 5)

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

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 的流缓冲,无法及时获得输出信息。

Continue reading

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

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

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

Continue reading

令人纠结的代码重用

比尔盖子用了 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-----

迁移到 ZFS

比尔盖子拥有三块具有 64 MB 缓存,500 GB 容量的西部数据企业级 WD RE4 盘。为了保证数据的安全性,使用主板自带的 RAID (即“FakeRAID”)建立了 RAID 5 磁盘阵列,在 Linux 下使用 mdadm 进行驱动,并在上面使用了 ext4 文件系统。这种配置可以得到不错的性能,但却有一些严重的问题。昨天,比尔盖子终于迁移到了 ZFS 以克服这些问题。 Continue reading

在 Linux 下使用 RTL8188CUS (磊科NW336)无线网卡

磊科 NW336 这款使用 RTL8188CUS 芯片的无线网卡大受欢迎,是有原因的。其一,价格便宜无比,在京东商城上仅售25元;其二,这款无线网卡可以在 Mac OS X 下工作,对于安装了黑苹果的人是一大福音,尽管驱动程序没有使用系统的原生管理接口,但还是有胜于无。

比尔盖子也正是因为这些原因而入手了这款网卡。在 Linux 下,这网卡可有得折腾了。一开始以为只要在 Linux 内核中勾选上差不多的驱动即可,没想到的是内核驱动存在 bug,能搜索到无线信号,却无法连接任何网络。好在,Realtek 发布了这款无线网卡的驱动源代码,所以这个问题应该是有解的。
Continue reading

新版mdadm导致Gentoo mdadm变成只读

更新1 (2012/12/30):这个 bug 已经被上报了数个月,直到前几天才有人找到了原因,并放出了 patch。

更新2 (2013/02/09):这个 bug 的 patch 终于被接受了,这效率……
Continue reading

折腾Nvidia分辨率,启用uvesafb

Nvidia不支持KMS已经令人诟病很长时间了,可不支持就是不支持。我们只能通过各种方式,来获得一个在没有KMS情况下完美/半完美的分辨率。有些幸运的人,在通过添加内核参数vga=791/792,就成功让自己的1024×768显示器配合VESA使用最佳分辨率了。而有些Nvidia的显卡BIOS还不太一样,有的在最差的状态下只支持800×600。这样的80×24终端除了复古,没人想要吧。
Continue reading

Olderposts Newerposts

Copyright © 2021 比尔盖子 博客

Theme by Anders NorenUp ↑