You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言调用system函数执行外部程序后主进程阻塞暂停问题

问题原因

C标准库的system()函数是同步阻塞调用,调用后主进程会暂停执行,直到system()启动的子进程完全退出、返回退出码后,主进程才会继续执行system()后续的代码。你遇到的现象完全符合这个特性:osu!StreamCompanion.exe运行期间system()一直不返回,所以后续的printf("Hopefully that worked\n")不会执行,直到关闭外部程序才会继续运行。

解决方案

针对Windows环境,有两种常用的解决方法:

  • 方案1:修改system()的调用参数,使用Windows内置的start命令后台启动程序
    start命令默认会异步启动目标程序,不会等待程序退出。注意路径带空格时,start后的第一个引号参数会被识别为窗口标题,所以需要加一个空引号占位,修改后的调用代码如下:

    #include<unistd.h>
    #include<stdio.h>
    
    int main() {
        printf ("Welcome to the Programm\n");
        // 新增start命令,空引号为窗口标题占位
        system ("start \"\" \"C:\\Program Files (x86)\\StreamCompanion\\osu!StreamCompanion.exe\"");
        printf ("Hopefully that worked\n");
        sleep(5);
        return 0;
    }
    

    该方案改造成本极低,适合简单场景使用。

  • 方案2:使用Windows原生API CreateProcess启动进程
    如果你需要更精细的进程控制(比如获取进程句柄、设置运行参数等),可以直接调用Win32 API CreateProcess,它本身支持异步启动,不需要等待子进程退出,示例代码如下:

    #include <windows.h>
    #include <stdio.h>
    #include <unistd.h>
    
    int main() {
        STARTUPINFO si = {sizeof(si)};
        PROCESS_INFORMATION pi;
        TCHAR cmd[] = TEXT("\"C:\\Program Files (x86)\\StreamCompanion\\osu!StreamCompanion.exe\"");
    
        printf("Welcome to the Programm\n");
        if (CreateProcess(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
            // 不需要等待子进程的话可以直接关闭句柄
            CloseHandle(pi.hProcess);
            CloseHandle(pi.hThread);
        }
        printf("Hopefully that worked\n");
        sleep(5);
        return 0;
    }
    

    该方案灵活性更高,适合复杂场景使用。

内容的提问来源于stack exchange,提问作者SillySoon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 11:27:00