Linux输入输出重定向
2022-02-01 # 学习笔记 # Linux

linux输入输出重定向

需求1:

通过程序来将pa aux命令输出的内容保存至一个文件中。

实现:

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>


int main(int argc, char* argv[])
{
int fd;
fd = open("out.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (fd < 0)
{
perror("open out.txt error");
exit(1);
}

dup2(fd, STDOUT_FILENO);

execlp("ps", "ps", "aux", NULL);

//close(fd)

return 0;
}

思路

用重定位的方式,让STDOUT文件描述符指向我们想要保存指令执行结果的文件。

再用exec函数族,将当前程序的内容替换为ps指令所对应的内容。

这样在执行过程中的输出,就自然的会放入我们制定好的文件当中。

存在问题

因为exec后,程序被替换,导致后续的close无法执行,文件描述符没有被关闭。只能依赖程序结束后通过系统回收。

后续可通过信号机制来处理。

相关函数

dup2函数

1
dup2(int oldfd,int newfd)

作用:让newfd文件描述符指向oldfd文件描述符所对应的文件。改变文件描述符的指向。

dup为仅复制一份文件描述符,保存一份文件描述符的副本。

exec函数族

作用:将当前程序所执行的内容替换为指定程序的内容。

1
2
int execl(const char *pathname, const char *arg)
int execlp(const char *file, const char *arg)

返回值:只有当发生错误时才返回-1,正常执行时不会返回

使用例:

1
2
3
execl("./a.out","./a.out","111",NULL);
execlp("ps", "ps", "aux", NULL);
execlp("ls", "ls", "-lah", NULL);

两个函数区别在于:

execl的文件指定方式可以采用绝对路径和相对路径

execlp的文件会从系统的环境变量中去寻找(execlp中的p即为path,环境变量)

注意:

  • arg为控制台参数,其起始位为0,所以第二个参数第一个位置应该填写argv[0],也就是文件路径名。

  • arg为可变参数,最后一个参数应为NULL,提示参数已经全部录入完毕。

  • 在控制台中带有”-“的参数,在参数中也应带有”-“。

  • arg对应的变量应为字符形式,即使想填写111之类的数字,也应以字符串的形式填入。

需求2:

在bash中实现上述操作

实现:

1
ps aux > out.txt

相关资料:

Linux下的输入输出重定向:http://c.biancheng.net/view/942.html