标准管道的使用

FILE * popen ( const char * command , const char * type );

第一个参数是命令,不是文件名

popen() 函数通过创建一个管道,调用 fork 产生一个子进程,执行一个 shell 以运行命令来开启一个进程。这个进程必须由 pclose() 函数关闭,而不是 fclose() 函数。pclose() 函数关闭标准 I/O 流,等待命令执行结束,然后返回 shell 的终止状态。如果 shell 不能被执行,则 pclose() 返回的终止状态与 shell 已执行 exit 一样。

标准管道是重定向标准输入和输出的

在主调程序中,若popen以写模式打开,说明主调函数需要将被调函数的运行所需的参数送人管道,因而重定向了被调函数的标注输入。此时,popen时,主调函数只需将被调函数的path写入命令行即可。被调函数会从管道中取走自己的参数,运行结果由被调函数打印在屏幕上。

在主调程序中,若popen以读模式打开,说明主调函数需要从管道获取程序运行结果,因而重定向了被调函数的标准输出。此时,popen时,主调函数需要将运行被调函数的完整参数写入放进命令行。被调函数运行后会将运行结果送入管道,主调程序自行从管道取出运行结果,打印在屏幕上。

//写模式popen.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
    char buf[1024];
    FILE *fp;

    while(memset(buf,0,1024),fgets(buf,1024,stdin) != NULL)
    {
        fp = popen(argv[1],"w");
        fputs(buf,fp);
        pclose(fp);
    }

    return 0;
}

被调用函数reverse.c因为主调函数写,这里的被重定向读,标准读scanf从主调函数里面获取数据
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
    char word[256]; //从标准输入读取字符串
    char buf[256][256],index = 0; //保存从标准输入读取的字符串
    while(memset(word,0,256), scanf("%s",word) != EOF )
    {
        strcpy(buf[index++],word);
    }
    index--;
    while(index >=0 )
    {
        printf("%s ",buf[index]);
        index--;
    }
    printf("\n");
    return 0;
}
gcc popen.c -o main

gcc reverse.c -o reverse
 ./main ./reverse
how are you
you are how

//读模式
popen.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char *argv[])
{
    FILE *fp;        /* 标准管道描述符 */
    char buf[1024];  /* 存放所要调用程序的参数 */
    char cmd[1024];  /* 存放所要调用的程序的命令行 */
    while(memset(buf,0,1024),fgets(buf,1024,stdin))
    {
        sprintf(cmd,"%s %s",argv[1],buf);
        fp = popen(cmd,"r");
        memset(buf,0,1024);
        fgets(buf,1024,fp);
        puts(buf);
        pclose(fp);
    }
    return 0;
}

被调用函数reverse.c因为主调函数读,这里的被重定向写,标准写printf将数据发送到主调函数要读的管道中
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
    int index;
    for(index = argc - 1; index > 0 ; index--)
    {
        printf("%s ",argv[index]);
    }
    return 0;
}
./main ./reverse
how are you
you are how
hello world
world hello
				
时间: 2024-12-20 21:08:52

标准管道的使用的相关文章

标准管道(popen)

NAME popen, pclose - pipe stream to or from a process SYNOPSIS #include <stdio.h> FILE *popen(const char *command, const char *type); int pclose(FILE *stream); DESCRIPTION The popen() function opens a process by creating a pipe, forking, and invokin

linux 管道通信

进程通信 进程是系统分配资源的最小单位, 不同进程之间是相互隔离的, Linux常用于进程通信的几种方式有 匿名管道及有名管道 : 匿名管道用于具有亲缘关系的进程通信, 有名管道则可用于一般进程之间. 信号 : 软件层对中断机制的一种模拟. 消息队列 共享内存 : 不同进程享同一块内存区域, 不同进程可以实时查看对方对共享内存的更新. 需要借助同步机制, 如互斥锁, 信号量. 信号量 : 主要用于不同进程以及同一进程不同线程的同步和互斥. 套接字 : 广泛用于网络间进程通信. 无名管道 管道是是

总结文件操作函数(二)-C语言

格式化读写: #include <stdio.h> int printf(const char *format, ...);                   //相当于fprintf(stdout,format,-); int scanf(const char *format, -); int fprintf(FILE *stream, const char *format, ...);      //中间的参数为写入文件的格式 int fscanf(FILE *stream, const

I.MX6 Manufacturing Tool V2 (MFGTool2) Update Command List (UCL) User Guide translate

Manufacturing Tool V2 (MFGTool2) Update Command List (UCL) User Guide Contents(目录) Contents(目录)                                                        1 1 Overview(概述)                                                      2 2 UTP mode operation(UTP模式操

详解Logstash配置

Logstash管道可以配置一个或多个输入插件.过滤器插件和输出插件.其中,输入插件和输出插件是必选的,过滤器插件是可选的.下图是Logstash常见的使用场景. 上一节的例子中我们使用标准的输入和输出插件做了简单的示例.接下来我们演示一些复杂的场景.如下图所示是Logstash的标准管道结构,我们通过一些高级配置来完成Apache日志的过滤. # The # character at the beginning of a line indicates a comment. Use# comme

进程间通信简述

1.信号 2.管道与命名管道 3.消息队列 4.共享主存 5.信号量 6.套接字 (1) 信号 ---- 信号机制是UNIX为进程中断处理而设置的.它只是一组预定义的值,因此不能用于信息交换,仅用于进程中断控制.例如在发生浮点错.非法内存访问.执行无 效指令.某些按键(如ctrl-c.del等)等都会产生一个信号,操作系统就会调用有关的系统调用或用户定义的处理过程来处理. ---- 信号处理的系统调用是signal,调用形式是: ---- signal(signalno,action) ----

2014025665《嵌入式程序设计》第七周学习总结

一.管道 本周我们学习了管道  消息队列的传输和接收 1.管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信. 2.信息队列(Messge Queue):消息队列的实现包括创建或打开消息队列.添加消息.读取消息和控制消息队列这 4 种操作.其中创建 或打开消息队列使用的函数是 msgget(),这里创建的消息队列的数量会受到系统消息队列数量的限制: 添加消息使用的函数是 msgsnd()函数,

机器学习:逻辑回归(使用多项式特征)

一.基础 逻辑回归中的决策边界,本质上相当于在特征平面中找一条直线,用这条直线分割所有的样本对应的分类: 逻辑回归只可以解决二分类问题(包含线性和非线性问题),因此其决策边界只可以将特征平面分为两部分: 问题:使用直线分类太过简单,因为有很多情况样本的分类的决策边界并不是一条直线,如下图:因为这些样本点的分布是非线性的: 方案:引入多项式项,改变特征,进而更改样本的分布状态: 二.具体实现 1)模拟数据集 import numpy as np import matplotlib.pyplot a

R语言数据清理:视频游戏数据案例研究

Wesnoth之战是一款开源的回合制策略游戏.游戏世界很丰富,有几个派系,地图和数百个可用单位.在本教程中,您将学习如何将中等大小的数据集(如游戏元数据)转换为有用的格式,以便使用R进行进一步分析. 您将了解整洁数据集遵循的关键原则,为什么跟踪它们有用,以及如何清理您给出的数据.整理也是了解新数据集的好方法. 最后,在本教程中,您将学习如何编写一个函数,使您的分析看起来更清晰,并允许您以非常可重复的方式在分析中执行重复元素.该功能允许您将最新版本的数据动态加载到灵活的数据方案中,这意味着在添加新