老程序员分享:popen实用实战

简介: 老程序员分享:popen实用实战

"

popen和system都可以执行外部命令。

popen相当于是先创建一个管道,fork,关闭管道的一端,执行exec,返回一个标准的io文件指针。

system相当于是先后调用了fork, exec,waitpid来执行外部命令

popen本身是不阻塞的,要通过标准io的读取使它阻塞

system本身就是阻塞的。

最近写的程序,要求进程在调用的外部命令运行完毕之后,再继续 向下进行。

一开始调用的popen,然后只是用了fgetc,使其阻塞,但是总是阻塞不了。原因就是如果外部命令有很多的输出内容,那fgets在得到输出的第一个字符的时候就返回了,不在阻塞了;调用fread,如果size和nitems设置的不够大,也是一样的问题。比如//代码效果参考:https://v.youku.com/v_show/id_XNjQwMDE0OTE1Mg==.html

外部命令要输出100个字符,结果size是sizeof(char),nitems是10,那么当fread读到地10个字符的时候,就已经满足条件了,就返回了。

正确的方法是调用system,因为system最后会调用waitpid,来等待子进程运行完毕。

其实可以调用pclose来阻塞

下面看一下代码示例:

test_log:

?1234567891011121314#include #include#include int main(void){ int t = 20; while(t-- > 0) { sleep(1); fprintf(stdout, ""run test log %d\n"", t); fflush(stdout); //这里不flush的话,popen可能无法实时读到这里输出的内容 } return 0;}

popen使用示例:

?1234567891011121//代码效果参考:https://v.youku.com/v_show/id_XNjQwNjU5MTQxMg==.html

31415161718192021int main(void){ char buf【LOG_MAX_PER_LEN】; FILE* fp = popen(""test_log"", ""r""); if(fp) { printf(""open success\n""); while(fgets(buf, LOG_MAX_PER_LEN, fp) != NULL) { if(buf【strlen(buf) - 1】 == '\n') { buf【strlen(buf) - 1】 = '\0'; } fprintf(stdout, ""【test log output】: %s\n"", buf); } } else { perror(""popen fail!\n""); return -1; } int ret = pclose(fp); printf(""pclose ret %d\n"", ret); return 0;}
"
image.png
相关文章
|
算法 计算机视觉 索引
OpenCV(四十六):特征点匹配
OpenCV(四十六):特征点匹配
1021 0
|
网络安全 数据库 数据安全/隐私保护
docker安装Neo4j Community Server
docker安装Neo4j Community Server
2001 0
docker安装Neo4j Community Server
|
存储 Unix Linux
在Linux中,如何查看⼆进制⽂件的内容?
在Linux中,如何查看⼆进制⽂件的内容?
|
网络协议 API
区分TCP/IP、HTTP、Socket三者的差异
HTTP关注于应用层的协议规范,而Socket关注于为应用程序提供编程中的网络功能,这些功能本身是建立在底层的TCP/IP协议之上;HTTP是更高层次的抽象,定义了如何包装数据,而TCP/IP定义了如何传送数据,Socket则是两者之间在程序中的桥梁,负责实现细节。在实际应用中,通常HTTP通信也是通过Socket来完成,因为HTTP仅是具体内容的封装形式,而Socket则是传送方式的实现形式。
1184 16
|
监控 Java 数据库连接
线程池在高并发下如何防止内存泄漏?
线程池在高并发下如何防止内存泄漏?
619 6
|
缓存 PyTorch 算法框架/工具
离线推理精度问题分析
传统模型迁移到昇腾设备上出现了精度问题,介绍精度问题的定位方法和解决方案,重点介绍了精度问题的定位定界方法。
离线推理精度问题分析
|
Shell 网络安全 开发工具
Gerrit✨Gerrit服务器简介 与 配置SSH keys
Gerrit✨Gerrit服务器简介 与 配置SSH keys
|
文字识别 自然语言处理 API
Python中的文字识别利器:pytesseract库
`pytesseract` 是一个基于 Google Tesseract-OCR 引擎的 Python 库,能够从图像中提取文字,支持多种语言,易于使用且兼容性强。本文介绍了 `pytesseract` 的安装、基本功能、高级特性和实际应用场景,帮助读者快速掌握 OCR 技术。
2180 0
|
安全 Linux 测试技术
Linux命令setpriv详解
`setpriv` 是Linux下的命令行工具,用于调整进程权限以增强安全性,尤其适用于自动化和非交互式权限切换。它不使用PAM,支持管理能力集、GID/UID及SELinux上下文。例如,`setpriv --reuid=1000 script.sh` 可以以低权限用户运行脚本,而`--selinux-label`可设定SELinux标签。在使用时,应最小化权限、充分测试、保持与其他安全机制的兼容性,并定期审核权限设置。