NTFS分区丢文件的问题……

之前发生了好几次,在FreeBSD下往NTFS分区拷东西,结果之后去win下一看,不见了…… 关于这个问题,找到过一个原因:如果先启动BSD,然后卸载某个NTFS分区,开一个直接使用那个NTFS分区的Win虚拟机,Suspend那个虚拟机,挂上那个分区,写东西,卸载,再Resume并正常关闭那个虚拟机,文件就会丢…… 这个问题挺好理解的,就是Win虚拟机自己保存了一些数据结构,你在Suspend期间对那个分区写的内容,Win虚拟机不知道。等他把数据结构flush回去,自然中间的改动就丢了…… 之后还是出这个问题,最近又找到一个原因:如果往NTFS分区复制文件,之后用reboot命令重启,文件也会丢…… 这个原因貌似是reboot是个很彪悍的命令,它不运行rc.d里那些脚本来停止服务,直接对所有进程发SIGTERM…… 于是cache里的数据没flush出去,那些文件就丢了…… 不过貌似这样文件是丢了,可用空间却会变少…… 如果在Win下检查NTFS分区,会说已使用位图不正确…… 以后不用reboot了…… 要不要直接alias掉呢…… 说起来init 6倒是没有问题…… shutdown -r自然也没有问题…… 这些都是好好地先停掉服务的……

inline, weak symbol以及其他

首先,如果某个test.h里有如下内容: class A { public: int x(); }   int A::x() { }class A { public: int x(); } int A::x() { } 那如果只有一个test.cpp引用了它: #include "test.h"   int main() { A a; a.x(); }#include "test.h" int main() { A a; a.x(); } 那还好。但如果还有一个test2.cpp引用了它: #include "test.h"   int foo() { A a; a.x(); }#include "test.h" int …

Continue reading ‘inline, weak symbol以及其他’ »

GeManX ver 67

修正了一个sx的bug…… 这段时间用GeManX,有时会崩溃…… 而且都是按p向下看贴的时候,而且崩溃之前多半出了输入法的候选词窗口…… 然后我就怀疑我写的显示预编辑内容的部分出问题了…… 开了个gdb启gemanx 结果一直开着输入法按p还真挂了…… 一看就是光标移到了窗口外面了…… 但是我记得我写了检查的,到了最后一行之外会移回来…… 结果一看代码,写的是: if (row == m_pTermData->m_ColsPerPage) 太弱智了…… 改成 if (row == m_pTermData->m_RowsPerPage) 就好了…… sx的typo……

关于#pragma interface

关于这个pragma,有某文档: http://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Interface.html 里面还有它的伴生pragma: #pragma implementation 大体意思是说,比如你有个A.h,有个A.cpp。A.h里面包含了一些除了类接口以外的一些东西,例如一部分类实现之类的,比方说,里面有类A,以及A::foo()的实现。 原来假如我是B.cpp,只要我#include你这个A.h,那我编译出来的B.o里面,就会有你的那一部分实现的副本,也就会有A::foo()的副本…… 然后有人觉得这样B.o会变大,于是发明了那俩pragma…… 定义了#pragma interface A 的头文件,引用它的B.cpp编译出来的B.o就不会包含那一部分实现的副本,而会有undefined symbol: undefined A::foo() 而与其对应的定义了#pragma implementation A的A.cpp,它编译出来的A.o里面,就会包含那一部分实现,也就是那些undefined symbol对应的东西: defined A::foo() 这样俩.o链接起来,就啥都有了,很好 === bug的分隔线 === 但是有时候有别的情况…… 例如其实那个类在一个C.so里面,而引用它的B.cpp是一个用了那个C.so的程序的一部分 于是B.cpp编译出来的B.o里面,那部分实现依旧是undefined symbol。但是,那些对应的symbol,在A.o和其他.o一起变成C.so的时候,都到了C.so里面。但是大概是由于链接的过程,原来的symbol信息没有导出来…… 于是C.so的导出symbol里面,并没有defined A::foo() 于是B.cpp位于的那个程序在链接的时候,就找不到那个A::foo()了,就有linker error了…… === 结论的分割线 === 总的来说,就是尽可能别用这个pragma…… 省那点空间没啥意义的…… 它文档里也说了 Note: As of GCC 2.7.2, these #pragmas are not useful in most cases 以及 Currently (3.4) the only benefit of …

Continue reading ‘关于#pragma interface’ »

GeManX rev 59

修了些小问题: 1. 之前有过编译的时候报CSite成员函数找不到的问题 研究了一下,貌似是#pragma interface干的好事,具体的再写一篇吧…… 2. libnotify更新之后,notify_notification_new参数变化 0.7.0之后,libnotify的API变了…… notify_notification_new()原来有四个参数,现在只有三个了…… 这种API不兼容真蛋疼……