【问题标题】:Unexpected blocking behavior on OSX, Pthreads and calls to system(3)OSX、Pthreads 和系统调用上的意外阻塞行为(3)
【发布时间】:2017-01-06 14:50:54
【问题描述】:

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

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

【问题讨论】:

    标签: macos pthreads posix system-calls


    【解决方案1】:

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

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

    【讨论】:

    • 我想我对线程的了解还不够。如果一个线程对系统进行调用,我希望该调用会阻塞,如果另一个线程对系统进行调用......为什么第二个调用会从单独的线程阻塞第一个调用?您是说这是系统的属性,并且内核不会......让您在程序的上下文中执行此操作而不管线程的使用?还是我错过了什么?
    • 只有调用 system() 的线程才能在 system() 调用中阻塞。
    • 这就是我的想法,这就是为什么我提到我最初的方法是为第一个系统调用启动一个线程,然后将其从另一个系统调用中杀死。
    猜你喜欢
    • 2013-10-19
    • 2020-11-11
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2017-04-14
    • 2014-07-15
    相关资源
    最近更新 更多