首页 > 其他分享 >popen 实用实战

popen 实用实战

时间:2022-08-27 17:13:07浏览次数:47  
标签:实战 调用 外部命令 system popen 实用 阻塞 buf

popen和system都可以执行外部命令。 popen相当于是先创建一个管道,fork,关闭管道的一端,执行exec,返回一个标准的io文件指针。 system相当于是先后调用了fork, exec,waitpid来执行外部命令 popen本身是不阻塞的,要通过标准io的读取使它阻塞 system本身就是阻塞的。 最近写的程序,要求进程在调用的外部命令运行完毕之后,再继续 向下进行。 一开始调用的popen,然后只是用了fgetc,使其阻塞,但是总是阻塞不了。原因就是如果外部命令有很多的输出内容,那fgets在得到输出的第一个字符的时候就返回了,不在阻塞了;调用fread,如果size和nitems设置的不够大,也是一样的问题。比如外部命令要输出100个字符,结果size是sizeof(char),nitems是10,那么当fread读到地10个字符的时候,就已经满足条件了,就返回了。 正确的方法是调用system,因为system最后会调用waitpid,来等待子进程运行完毕。 其实可以调用pclose来阻塞  
下面看一下代码示例: test_log:
#include <stdio.h>
#include<string.h>
#include <unistd.h>

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使用示例:
int 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;
}

 

标签:实战,调用,外部命令,system,popen,实用,阻塞,buf
From: https://www.cnblogs.com/Arnold-Zhang/p/16630750.html

相关文章

  • Go并发编程实战 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1YJh-LYhg-Eb4nPtwPDqusQ点击这里获取提取码本书首先介绍了Go语言的优秀特性、安装设置方法、工程结构、标准命令和工具、语......
  • JPA 入门实战(3)--Spring Boot 中使用 JPA
    本文主要介绍在SpringBoot中使用JPA的方法(暂不使用spring-data-jpa),相关的环境及软件信息如下:SpringBoot2.6.10、JPA2.2、eclipselink2.7.10。1、原生使用该......
  • ASP.NET Core 6.0+Vue.js 3 实战开发(视频)
    大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章或视频能成为你成长路上的垫脚石。录制视频的体验这是一个收费的视频,很抱歉,让您失望了。我尝试......
  • 【云原生】镜像构建实战操作(Dockerfile)
    目录一、概述二、Dockerfile结构三、常用Dockerfile操作指令1)镜像构建(dockerbuild)2)运行容器测试(dockerrun)3)ARG4)FROM5)MAINTAINER(已弃用)6)VOLUME7)RUN8)COPY9)ADD10)ENV11)WORKDI......
  • 前端项目实战22-前端处理二进制流
    constdownURL=window.URL.createObjectURL(newBlob([data])); //data为获取到的二进制数据 constlistNode=document.createElement("a"); //这里注意:非同......
  • 前端项目实战23-前端上传文件进行数据绑定用fileList
    <Uploadname="file"action="xxxx"onChange={handleChange}......
  • C#实用教程-操作xml文件
    C#实用教程-操作xml文件引言:什么是xml文件可扩展标记语言,标准通用标记语言的子集,简称XML。是一种用于标记电子文件使其具有结构性的标记语言。在电子计算机中,标记指计算机......
  • Serverless实战——2分钟,教你用Serverless每天给女朋友自动发土味情话
    原文链接:https://developer.aliyun.com/article/981268演示视频:https://developer.aliyun.com/live/249772一、Serverless简介Serverless,中文意思是“无服务器”,所谓的......
  • 《遗留系统现代化实战》读书笔记
    遗留系统的定义请你先思考这样一个问题:假如一个系统七八年了,它是不是个遗留系统?系统的时间长等同于就是遗留系统,这是很多人的一个误区。虽然大多数遗留系统确实是存在的时......
  • 分布式事务实战方案汇总
    1.最终一致性1.1本地事务表+轮询补偿交互流程  ①commitDB事务提交阶段本地客户端向DB进行事务提交,此时需要将业务数据和记录消息事务状态的信息表......