Macos OSX、pthread和系统调用上的意外阻塞行为(3)

Macos OSX、pthread和系统调用上的意外阻塞行为(3),macos,pthreads,posix,system-calls,Macos,Pthreads,Posix,System Calls,我正在编写一个程序,使用system()启动一个长时间运行的进程(afplay,带有长声音文件),稍后可能会决定终止这个进程。调用一个系统(“prog”)调用,然后再调用一个系统(“killall prog”)调用似乎很简单。使用pthreads,我启动一个线程来调用初始系统(“prog”)调用,然后,如果应用程序检测到它要提前终止,主线程将调用系统(“killall prog”)。通过print语句,我可以看到主线程正确地检测到要停止的逻辑,但随后的系统调用会阻塞,直到原始系统调用完成(主线程

我正在编写一个程序,使用system()启动一个长时间运行的进程(afplay,带有长声音文件),稍后可能会决定终止这个进程。调用一个系统(“prog”)调用,然后再调用一个系统(“killall prog”)调用似乎很简单。使用pthreads,我启动一个线程来调用初始系统(“prog”)调用,然后,如果应用程序检测到它要提前终止,主线程将调用系统(“killall prog”)。通过print语句,我可以看到主线程正确地检测到要停止的逻辑,但随后的系统调用会阻塞,直到原始系统调用完成(主线程直到此时才显示为阻塞,其他活动确实会在初始系统调用的线程创建之后进行)。如果我在程序调用prog后从一个单独的shell中尝试killall,killall就会工作(正如您所期望的)。我知道macOS对与ui库交互的程序有要求,这些程序只需要从主线程处理此类活动。对于向系统(3)输出的程序,是否有其他我显然不知道的要求

在windows上,代码中唯一的区别是对“prog”的选择,行为的工作方式与我预期的一样。

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


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

我想我对线程理解不够。若一个线程调用系统,我希望那个调用会阻塞,若另一个线程调用系统。。。为什么第二个调用会阻止来自不同线程的第一个调用?你是说这是系统的一个属性,内核不。。。是否允许您在程序上下文中执行此操作,而不考虑线程的使用?或者我遗漏了什么?只有调用system()的线程才应该在system()调用中阻塞。这就是我所想的,这就是为什么我提到我最初的方法是为第一个系统调用启动一个线程,然后从另一个系统调用中终止它。