进程间通信(四)——popen函数

2023-11-04 03:58
文章标签 函数 间通信 进程 popen

本文主要是介绍进程间通信(四)——popen函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

popen函数

通过管道与shell命令进行通信

  • popen函数
    • FILE *popen(const char *command, const char *type);
    • 创建一个管道,并创建一个子进程来执行shell,shell会创建一个子进程来执行command
    • 将父子进程的输入/输出重定向到管道,建立一个单向的数据流
    • 返回一个fp文件指针给父进程,父进程可根据fp对管道进行读写
    • 向管道中读数据,读命令的标准输入
    • 向管道中写数据,写入该命令的标准输入

使用popen函数,建立起读模式、写模式就好

  • 读模式调用popen
    • popen(command, "r");
    • popen函数创建输入写入到管道,被调用popen来的父进程读取
    • 子进程的标准输出写入到管道,被调用popen的父进程读取
    • 父进程通过对popen返回的fp指针读管道,获取执行命令的输出
  • 写模式调用popen
    • fp = popen(command, "w");
    • popen函数创建子进程执行command,创建管道
    • 调用popen的父进程,通过fp进行对管道进行写操作
    • 写入的内容通过管道传给子进程,作为子进程的输入
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>#define handle_error(s) \{perror(s);exit(-1);}int popen_read(void)
{FILE *fp;char buf[1024] = {0};fp = popen("cat popen.c", "r");if (fp == NULL)handle_error("popen");fread(buf, 1, 1024, fp);printf("%s\n", buf);pclose(fp);return 0;
}int popen_write(void)
{FILE *fp;char buf[128] = "Dear kiki";fp = popen("cat > data520.log", "w");if (fp == NULL)handle_error("popen");fwrite(buf, 1, sizeof(buf), fp);fclose(fp);return 0;
}int main(int argc, char *argv[])
{popen_read();popen_write();   return 0;
}

这篇关于进程间通信(四)——popen函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/343063

相关文章

python多进程实现数据共享的示例代码

《python多进程实现数据共享的示例代码》本文介绍了Python中多进程实现数据共享的方法,包括使用multiprocessing模块和manager模块这两种方法,具有一定的参考价值,感兴趣的可以... 目录背景进程、进程创建进程间通信 进程间共享数据共享list实践背景 安卓ui自动化框架,使用的是

Oracle的to_date()函数详解

《Oracle的to_date()函数详解》Oracle的to_date()函数用于日期格式转换,需要注意Oracle中不区分大小写的MM和mm格式代码,应使用mi代替分钟,此外,Oracle还支持毫... 目录oracle的to_date()函数一.在使用Oracle的to_date函数来做日期转换二.日

C#如何优雅地取消进程的执行之Cancellation详解

《C#如何优雅地取消进程的执行之Cancellation详解》本文介绍了.NET框架中的取消协作模型,包括CancellationToken的使用、取消请求的发送和接收、以及如何处理取消事件... 目录概述与取消线程相关的类型代码举例操作取消vs对象取消监听并响应取消请求轮询监听通过回调注册进行监听使用Wa

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

[Linux]:进程(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 进程终止 1.1 进程退出的场景 进程退出只有以下三种情况: 代码运行完毕,结果正确。代码运行完毕,结果不正确。代码异常终止(进程崩溃)。 1.2 进程退出码 在编程中,我们通常认为main函数是代码的入口,但实际上它只是用户级

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据