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 APICreateProcess,它本身支持异步启动,不需要等待子进程退出,示例代码如下:#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
相关产品推荐
相关产品推荐

