经过前段时间的学习,终于理解了cygwin的大部分运行机制,只是很遗憾对其signal关键技术的细节未能完全掌握,以致于依赖于signal机制的程序未能正确运行。还是采用老办法,先转移阵地,哪天再杀回来,嘿嘿。
先发布一个阶段性的版本,以示咱至少往前挪了一小步。这个版本包括以下内容:
Cygwin checkout 2008-09-28
Bash 4.0
Core-utils 7.6
Grep 2.5.4
Sed 4.2
Diffutils 2.8.1
由于signal机制的缺失,bash的下述测试脚本未能与正确结果完全一致:
array coproc cprint dirstack errors execscript extglob glob-test
heredoc herestr ifs-posix intl iquote jobs more-exp nquote2 nquote3
nquote4 posixpat precedence printf read redir rhs-exp rsh set-e
shopt trap type
有兴趣的可以到个人资源中下一个权当玩具:
http://lights_joy.download.csdn.net/
回顾整个过程,基本实现了当初的一个主要目标:让cygwin.dll与vs2008的crt和平共处!但是为了达到此目的,不得不做了一些牺牲:
1、对cygwin的所有导出函数进行了重命名的处理,比如open就变成了cyg_open,再由于批量替换的操作,导致了很多的提示字符串特别怪异。
2、需要先运行vs2008的crt代码,然后再运行cygwin的crt,于是一个很简单的main函数就变成了:
int
real_main (int argc, char **argv, char** envp);
int
main (int argc, char **argv)
{
return cygwin_crt0(real_main);
}
int
real_main (int argc, char **argv, char** envp)
{
………
原来的main函数。
}
3、虽然可以混合使用cygwin.dll和vs的库,但是当需要使用fork的时候,很多东西就只能限制在使用cygwin.dll提供的函数。比如内存分配,文件操作等,在不使用fork的时候想用哪个都可以,但是如果要使用fork机制,则只能使用cygwin.dll。
一个比较理想的状态应该是既允许只使用cygwin,也允许混合使用cygwin和vs的库。通过一个简单的宏进行控制。
顺便发点感慨,虽然原来对libc的内容分类的判断基本准确,但是真正做完移植,才发现原来对libc的认识还是肤浅了一点!真的是不做不知道,一做吓一跳!