实现流的重定向

思路:

写一个程序,运行./aout inputfile outputfile。在程序中用dup2函数将标准输入重定向到inputfile,将标准输出重定向到outputfile。用exec函数族调用起upper函数(自己写的函数,功能是将字符转换为大写),upper不知道标准输入和输出已经被更改,则它会从input file中读数据,转换成大写后输出到outputfile。

upper.c

#include "./common/head.h"

/*功能:
 *将标准输入的内容,转化为大写,输出到标准输出。
*/

int main()
{
    int ch;
    while( ~(ch = getchar() ){    //while( (ch = getchar()) != EOF )    //EOF值为-1
        putchar(toupper(ch));
    }

    return 0;
}

$gcc upper.c -o upper 

redirect.c

#include "./common/head.h"

/*功能:
 *将标准输入重定向到inputfile,标准输出重定向到outputfile
 *exec调度起upper函数,接管此进程
 *效果是将inputfile中的内容转化成大写,输出到outputfile
*/

int main(int argc, char *argv[])
{
    if(argc != 3){
        printf("usage: cmd inputfile outputfile\n");
        return 1;
    }

    int fd = open(argv[1], O_RDONLY);
    if(fd < 0){
        perror("open read");
        exit(1);
    }
    dup2(fd, 0);    //将标准输入0的文件描述符,指向fd(inputfile)
    close(fd);

    fd = open(argv[2], 1);    //将标准输出1的文件描述符,指向fd(outputfile)
    if(fd < 0){
        perror("open write");
        exit(1);
    }
    close(fd);

    execl("./upper", "upper", NULL);    //调度起upper函数
    //如果exec成功执行,则进程被upper接管,不会运行到这里。若失败,则打印错误信息
    perror("exec");
    exit(1);

    return 0;
}

你可能感兴趣的:(linux,c++,ubuntu)