通过重定向标准输出将Shell命令结果输出到容器之中

一、实现要求

将System命令(例如ls命令)的结果输出到字符串容器buf中,并输出buf到标准输出。主要考察文件描述符的重定向。

二、思路及代码实现

思路

通过使用dup 函数和dup2函数,先把system结果输出到文件中,然后再读取文件内容即可。具体步骤如下:

  • 创建一个文件,它的描述符为fd
  • 使用dup 函数复制STDOUT_FILENO(标准输出)文件描述符到sfd
  • 使用dup2 函数把STDOUT_FILENO 文件描述符指定为fd
  • 执行system("ls") 函数,把ls 的结果输出到文件中;
  • 使用lseek 函数把文件指针移到文件首部;
  • 使用read 函数读出内容到buffer
  • 使用dup2 函数将STDOUT_FILENO 还原(把sfd 指定为它);
  • 输出buffer 到标准输出。

关于dupdup2函数的介绍如下:

#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);

dup函数创建一个新的文件描述符,该新文件描述符和原文件描述符指向相同的文件、管道或者网络连接,并且dup返回的新文件描述符是取系统当前可用的最小整数值,dup2和dup类似,不过它返回的是第一个不小于新文件描述符的整数值,dup和dup2调用失败时都返回-1并设置errno。

代码实现

#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{
    int fd = open("tmpFile.txt", O_CREAT | O_RDWR);
    int sfd = dup(STDOUT_FILENO);
    dup2(fd, STDOUT_FILENO);
    system("ls");
    char buffer[1024] = {0};
    lseek(fd, 0, SEEK_SET);
    read(fd, buffer, 1024);
    close(fd);
    dup2(sfd, STDOUT_FILENO);
    printf("buffer=%s\n", buffer);
    return 0;
}

测试结果

查看当前目录下tmpFile.txt内容:
在这里插入图片描述
标准输出:
在这里插入图片描述
可以看到ls命令的结果已经输出到了文件中,并且通过读取文件,将结果又输出到了buffer之中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值