我这里有一个奇怪的问题。
我写了一些C ++代码,它们使用Declare @sq int --LEN returns an int, not a varchar!
SELECT @sq = MAX(LEN(FIRST_NAME))
FROM #table1
,popen(3)
和read(3)
来运行各种shell命令,解析它们的输出并做其他事情。该程序似乎运行良好。
然后,我将一些代码提取到共享库中,并尝试从Mono下运行的C#程序中使用它。现在,C ++代码根本不起作用。
在GDB中运行代码,看来pclose(3)
总是无条件地返回-1,而不是子进程的 real 退出代码。
看着pclose(3)
,看来strace
失败了,wait4(2)
。而且,据我所知,这样做是因为ECHILD
被传递到Mono的其他线程之一,该线程立即执行多个SIGCHLD
调用,然后继续执行。
进行一些Google搜索后,内核似乎随机选择了一个线程来发送wait4(2)
到。 (换句话说,在多线程程序中,保证总是选择“错误的”线程。)
很明显,我无法控制Mono运行时的决定。那么如何调用外部进程并可靠地获取其退出代码?
答案 0 :(得分:2)
pclose()
从不返回子进程的真实退出代码。
pclose
宁可将stat_loc
参数的值返回给wait()
调用。
在某些情况下,当具有子进程ID的waitpid()
返回-1
时,pclose()
也返回-1
。
如果您在其他线程中等待其他子进程而不是仅等待自己创建的子进程的代码损坏,就会发生这种情况。