一、实现要求
将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
到标准输出。
关于dup
和dup2
函数的介绍如下:
#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
之中。