|
|
本帖最后由 不点 于 2018-6-16 11:08 编辑
一去掉 CLONE_VFORK 就导致 cish 崩溃的问题,已经解决。正如先前的分析,问题确实是因不同的线程分别写入某些敏感的共有变量造成的。解决的办法是,让这些敏感的共有变量成为局部变量,或者把它们放在函数的参数表中进行传递,这就避免了互相影响。
在下面的测试中,管道的第一个成员每隔 5 秒打印出 See i=<序号>(从 0 到 9)。管道的第二个成员就是 cat 命令。运行结果,不是像以前那样(错误地)先等待 50 秒,然后一次性打印出 10 行;而是立即开始打印,每隔 5 秒打印一次。这说明管道两边已经是都在运行了,而不是先运行左边的成员函数(即第一个成员函数),等待它彻底结束后才运行右边的成员函数(即第二个成员函数)。
- user@ttyd:~$ cish
- [cling]$ pad([]{for (int i=0;i<10;i++){printf("See i=%d\n",i);sleep(5);}})
- (int) 0, 0, 0x00000000, 0
- [cling]% pen([]{shellInterpreter("cat");})
- See i=0
- See i=1
- See i=2
- See i=3
- See i=4
- See i=5
- See i=6
- See i=7
- See i=8
- See i=9
- (int) 0, 0, 0x00000000, 0
- [cling]% exit
- user@ttyd:~$
复制代码
再看一例。在下面的测试中,管道中的两个成员各自休息 15 秒,什么也不做。运行结果,不是像以前那样(错误地)等待 30 秒才结束,而是(正确地)等待 15 秒就结束了。这说明管道两边是并行运行的,而不是先运行左边的成员函数(即第一个成员函数),等待它彻底结束后才运行右边的成员函数(即第二个成员函数)。
- user@ttyd:~$ cish
- [cling]$ pad([]{sleep(15);})
- (int) 0, 0, 0x00000000, 0
- [cling]% pen([]{sleep(15);})
- (int) 0, 0, 0x00000000, 0
- [cling]% exit
- user@ttyd:~$
复制代码
|
|