我正在编写一个程序,使用system()启动一个长时间运行的进程(afplay,带有长的声音文件),稍后可能会决定终止该进程。似乎先调用一个系统(“prog")调用,然后再调用一个系统(”killall prog“)调用是很简单的。使用pthread,我启动一个线程来调用初始系统(“prog")调用,然后如果应用程序检测到是时候提前终止了,主线程将调用system("killall prog”)。通过print语句,我可以看到主线程正确地检测到要停止的逻辑,但是后续的系统调用会阻塞,直到原始系统调用结束(主线程直到此时才看起来阻塞,其他活动确实会在初始系统调用的线程创建之后进行)。如果在我的程序调用prog之后,我从一个单独的shell尝试了killall,killall就会工作(正如您所期望的)。我知道macOS对与ui库交互的程序有要求,这些程序需要仅从主线程处理此类活动。对于系统(3)的程序,有没有其他我显然不知道的要求?
在windows上,代码中唯一的区别是对"prog“的选择,行为和我期望的一样。
发布于 2017-01-06 23:13:10
system()预计会一直阻塞,直到启动的程序退出--如果它没有退出,system()将无法返回子进程的退出状态作为其返回值的一部分。
如果希望线程继续与子进程并行执行,则需要使用不同的API (通常是fork(),然后从子进程的fork分支调用exec() )。
https://stackoverflow.com/questions/41508178
复制相似问题