system popen 输出重定向和显示输出的问题

本文介绍了在Linux环境下如何利用system和popen函数捕获shell命令的输出,并提供了详细的代码示例,包括输出重定向、标准输出重定向及管道的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(一)system 使用

1,输出重定向实现

此方法比较简单,步骤如下

1)system("date > tmp.txt");    --将date指令的输出重定向到tmp.txt文件中

2)使用open();read();等操作函数来获取tmp.txt的内容


2,重定向标准标准输出+管道实现

1)将标准输出重定向到管道:

int fd[2],backfd;

pipe(fd);

backfd=dup(STDOUT_FILENO);   --备份标准输出,永远恢复

dup2(fd[1],STDOUT_FILENO);    --将标准输出重定向到匿名管道输入端

2)执行system();

system("date");

3)获取结果并恢复标准输入

read(fd[0],buf,1024);

dup2(backfd,STDOUT_FILENO);


3,完整代码


  1. #include<stdio.h>  
  2. #include<unistd.h>  
  3. #include<stdlib.h>  
  4.   
  5.   
  6. int main(void)  
  7. {  
  8.     char buf[1024]={0};  
  9.     int fd[2];  
  10.     int backfd;  
  11.     pipe(fd);  
  12.     backfd=dup(STDOUT_FILENO);//备份标准输出,用于恢复  
  13.     dup2(fd[1],STDOUT_FILENO);  //将标准输出重定向到fd[1]  
  14.     system("date");  
  15.       
  16.     read(fd[0],buf,1024);  
  17.   
  18.     dup2(backfd,STDOUT_FILENO);  //恢复标准输出  
  19.     printf("this is a test :\n%s",buf);  //上面不恢复,则此处的执行结果无法再屏幕上打印  
  20.   
  21.     return 0;  
  22. }  

(二)popen 使用

#include <sys/types.h>  
#include <unistd.h>  
#include <stdlib.h>  
#include <stdio.h>  
#include <string.h>

int main( void )  
{  
    FILE   *stream;  
    FILE    *wstream;
    char   buf[1024];
    
    memset( buf, '/0', sizeof(buf) );//初始化buf,以免后面写如乱码到文件中
    stream = popen( "ls -l", "r" ); //将“ls -l”命令的输出 通过管道读取(“r”参数)到FILE* stream
    wstream = fopen( "test_popen.txt", "w+"); //新建一个可写的文件

    fread( buf, sizeof(char), sizeof(buf),  stream);  //将刚刚FILE* stream的数据流读取到buf中
    fwrite( buf, 1, sizeof(buf), wstream );//将buf中的数据写到FILE    *wstream对应的流中,也是写到文件中
   
    pclose( stream ); 
    fclose( wstream );
   
    return 0;
(三)popen 与system
  system函数首先建立一个新的进程,然后在新的进程中执行exec函数去执行我们的shell命令,然后阻塞等待shell命令执行完后,返回到调用函数,system之所以要建立新的进程,是因为,exec函数的调用会结束调用进程,从调用exec函数开始,进程就切换到执行shell命令的进程,无法回到调用exec的进程继续执行程序的余下部分。所以system就会新建进程去执行exec,exec结束掉system创建进程,返回的时候,将返回值送给调用system的进程。换句话说,system建立的进程就是为了给exec函数结束用的。
   linux对system函数做了很好的优化,在system建立进程的时候,不会像建立普通进程那样消耗系统的资源,system进程只有用到数据的时候,系统才为其分配,如果只是单纯的执行shell命令,效率还是很高。
https://blog.youkuaiyun.com/liuxingen/article/details/47057539(建议查看这篇文章,很详细)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值