OSX上的意外阻塞行为,Pthreads和对系统的调用(3)

时间:2017-01-06 14:50:55

标签: macos pthreads posix system-calls

我正在开发一个程序,使用system()启动一个长时间运行的进程(afplay,包含长声音文件),稍后可能会决定终止此进程。似乎可以直接调用系统(“prog”)调用,然后调用系统(“killall prog”)调用。使用pthreads,我启动一个线程来调用初始系统(“prog”)调用,然后如果应用程序检测到它提前终止的时间,主线程将调用system(“killall prog”)。通过print语句,我可以看到主线程正确检测到要停止的逻辑但后续系统调用阻塞,直到原始系统调用结束(主线程似乎没有阻塞,直到这一次,其他活动确实通过线程进行创建初始系统调用)。如果我在程序调用prog后从单独的shell中尝试killall,则killlall可以正常工作(正如您所期望的那样)。我知道macOS对与ui库交互的程序的要求只需要从主线程处理这样的活动。对于系统(3)的程序是否有其他要求我明显不知道?

在Windows上,代码中唯一的区别是“prog”的选择,并且行为按预期工作。

1 个答案:

答案 0 :(得分:0)

system()预计会阻止,直到启动的程序退出 - 如果它没有,系统()将无法返回子进程的退出状态作为其返回值的一部分

如果您希望您的线程继续与子进程并行执行,您将需要使用不同的API(通常是fork(),然后从fork的子进程的分支调用exec() )而不是。