linux 内核输出重定向,Linux API 实践:输入输出重定向

在shell中对程序进行重定向很简单,用符号就可以了,但在自己的程序中怎么实现输入输出重定向呢?

先来看看Linux内核中,文件(还是设备)是通过哪些数据结构保存的:

bcaad73940d881d8c8a1ab8edecb3350.png

每个进程都保存一份文件描述符的表格,每一行又指向file table,然后file table再指向v-node table。v-node table我们可以暂不考虑,暂且把它当作文件的内容。而从process table entry中的file pointer可以指向不同或者相同的file table。原本标准输入输出是指向“键盘”和“屏幕”这两个设备的,如果可以将它们指向我们指定的文件,就可以实现重定向了。

先用open()打开需要重定向到的文件,获取去文件描述符fd,在用dup2()把进程中原先的输入输出文件描述符STDIN_FILENO和STDOUT_FILENO重定向至fd,这样就可以实现输入输出重定向了。我想,shell实现重定向也应该是类似的思想,关键代码如下:#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

int main (int argc, char** argv)

{

if ( argc != 3 )

{

printf("usage: inputFile outputFile\n");

return 1;

}

int inFd, outFd;

//open file descriptor

inFd = open(argv[1], O_RDONLY);

if ( inFd < 0 )

{

printf("inFd open error!\n%s\n",strerror(errno));

return 1;

}

outFd = open(argv[2], O_CREAT | O_TRUNC | O_RDWR, S_IRWXU | S_IRGRP | S_IROTH);

if ( outFd < 0 )

{

printf("outFd open error!\n%s\n", strerror(errno));

return 1;

}

//change standard input and output

if ( dup2(inFd, STDIN_FILENO) < 0 )

{

printf("inFd dup2 error!\n");

return 1;

}

if ( dup2(outFd, STDOUT_FILENO) < 0 )

{

printf("outFd dup2 error!\n");

return 1;

}

char line[128];

while ( scanf("%s", &line) != EOF )

{

printf("%s\n", line);

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值