C语言中popen调用是否会阻塞等待所执行的命令运行完成?
关于popen是否阻塞等待命令执行完成的解答
你的理解完全准确,popen 不会等待目标命令执行完成后才返回,只要前置操作执行成功就会立即返回FILE指针。
popen的核心工作机制
- 调用
popen时会按顺序执行管道创建、内存分配、fork子进程几个前置操作,只有这几个步骤出现错误时,popen才会返回NULL - 子进程创建成功后会独立执行
exec调用运行传入的cmd_str,父进程没有等待子进程执行结束的逻辑,直接将关联了管道的FILE指针返回给调用者 - 即使你传入的命令需要数分钟甚至更长时间运行,只要前置步骤没有报错,
popen就会立刻返回,不会产生阻塞 - 子进程执行
exec加载命令失败的情况,popen的返回值也无法体现,需要后续操作才能感知
使用注意事项
- 对
popen返回的FILE指针执行fread、fgets等读操作时才可能发生阻塞,此时是在等待子进程往管道中写入输出数据 - 命令的执行结果、退出状态无法通过
popen的返回值判断,需要调用pclose回收资源时,通过pclose的返回值获取子进程的退出状态来确认 - 使用完FILE指针后必须调用
pclose回收资源,否则会导致僵尸进程泄漏系统资源
内容的提问来源于stack exchange,提问作者etspam
相关产品推荐
相关产品推荐

