简单说, 它让你对所有显而易见的路径名的理解失效. 我最近一次遭遇这个问题是通过 dlopen动态打开so文件时碰到的, 在vsftpd内部加载它, 而vsftpd是典型的会chroot的程序, 在何处load动态库是关键, 一般来说, 碰到这种加载dlopen失败的问题, 第一反应是检查路径存在与否, 权限是否允许, 如果不是绝对路径, 是否在LD_LIBARARY_PATH等等, 是否是递归依赖的其它动态库找不到(windows上加载DLL就经常碰到这个问题). 但最终的解决办法是把dlopen的调用时机调到了main中刚开始的位置, 此时还没有进行chroot.
原本想在多个进程之间实现数据共享的一个办法是通过普通文件, 然后用一个文件锁open(..., O_CREAT | O_EXCL)来实现排它性访问, 同样是在碰到chroot时没了办法, 所有基于层次状文件系统的方案都不可用了. 因为chroot让你对固定的绝对路径名的理解失效了. 最后的替代方案是用共享内存, 附加一个semaphore控制对共享内存的独占性访问.
以后在考虑这种进程间通讯方案时, 需要加一个case, 参与通讯的进程, 有无可能chroot, 若有, 则不能用基于文件系统的方案了.
阅读(1370) | 评论(0) | 转发(0) |