APUE之dup,dup2函数重定向标准输出实例

目的:重定向标准输出到一个文件之中。

定义这两个函数的头文件是 unistd.h 

这个头文件同时定义了下面三个常量:

* STDIN_FILENO
= 0 标准输入

* STDOUT_FILENO
= 1 标准输出

* STDERR_FILENO
= 2 标准出错输出

dup和dup2函数

#include <unistd.h>

int dup (int filedes);

int dup2 ( int filedes,int filedes2);

两函数的返回值:若成功则返回新的文件描述符,若出错则返回-1

由dup返回的新文件描述符一定是当前可用文件描述符中的最小值。

用dup2则可以用filedes2参数指定新描述符的数值,如果filedes2已经打开,则先将其关闭。如若filedes等于filedes2,则dup2返回diledes2,而不关闭它。

重定向标准输出

实例1:

#include<stdio.h>
#include<unistd.h>
#define TESTSTR "Hello dup2\n"
int main(int argc,char **argv)
{
        int fd;
        fd =open("testdup2",0666);//打开文件操作
        if(fd<0)
        {
        printf("open error\n");
        exit(-1);
        }
        if(dup2(fd,STDOUT_FILENO) < 0) //括号内把输出重定向到fd标识的文件
        {
                printf("error in dup2\n");
        }
        printf("TESTSTR\n");
        printf(TESTSTR);
        return 0;// close(fd)
}                              //         显示  TESTSTR
<span style="white-space:pre">						</span>Hello dup2

实例2:制成makefile

dup2_1.c

#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<unistd.h>
#define TESTSTR "Hello dup2\n"
int main(int argc,char **argv)
{
        int fd;
        if(argc<2)
        {
                printf("Usage: [file1] [file2] \n",strerror(errno));
                exit(1);
        }
        print(argv[1],TESTSTR);
        return 0;
}

print.c

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>

void print(const char *filename,const char *str)
{
        int fd;
        if((fd = open(filename,0666))<0)
{
        printf("open erro");
        exit(1);
}
        dup2(fd, STDOUT_FILENO);

        printf("Say = %s",str);
}

print.h

#ifndef _PRINT_H
#define _PRINT_H  

void print(const char *filename, const char *str);  

#endif

makefile

[[email protected] practice]$ cat makefile
bins=main
objs=dup2_1.o
srcs=dup2_1.c

$(bins):$(objs)
        gcc -o main dup2_1.o print.o

$(objs):$(srcs)
        gcc -c dup2_1.c
        gcc -c print.c print.h
clean:
        rm -f $(bins) *.o

测试:

[[email protected] practice]$ ./main
Usage: [file1] [file2]
[[email protected] practice]$ ./main test_1.c
[[email protected] practice]$ cat test_1.c
Say = Hello dup2

时间: 2024-11-10 15:56:16

APUE之dup,dup2函数重定向标准输出实例的相关文章

dup/dup2函数学习

dup/dup2函数用来实现文件描述符之间的拷贝.对此,先来看看函数的声明: #include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd); dup函数 dup函数传入一个文件描述符,oldfd必须是已打开的文件描述符,否则dup函数调用失败.返回值为当前系统可用的最小文件描述符.测试程序如下: #include <stdio.h> #include <string.h> #include

笔记3-6: dup/dup2函数

dup与dup2函数 用于复制现存的文件描述符. 原型: #include <unistd.h> int dup(int fd); int dup2(int fd, int fd2); 两函数若成功则返回新描述符,出错则返回-1. dup函数返回一个新的描述符,并且这个新描述符一定是可用描述符中数值最小的一个. dup2函数使用fd2参数指定的数值返回新描述符,如果fd2已经打开,则先关闭fd2. 笔记3-6: dup/dup2函数,布布扣,bubuko.com

linux下dup/dup2函数的用法

系统调用dup和dup2能够复制文件描述符.dup返回新的文件文件描述符(没有用的文件描述符最小的编号).dup2可以让用户指定返回的文件描述符的值,如果需要,则首先接近newfd的值,他通常用来重新打开或者重定向一个文件描述符. 他的原型如下: #include <unsitd.h> int dup(int oldfd); int dup2(int oldfd,int newfd); dup 和dup2都是返回新的描述符.或者返回-1并设置 errno变量.新老描述符共享文件的偏移量(位置)

dup,dup2函数【转】

转自:http://eriol.iteye.com/blog/1180624 转自:http://www.cnblogs.com/jht/archive/2006/04/04/366086.html dup和dup2也是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符.它们经常用来重定向进程的stdin.stdout和stderr.这两个函数的原形如下: C代码   #include <unistd.h> int dup( int oldfd ); int dup2( int old

dup/dup2函数

原子操作(automic operation)指的是由多步组成的操作.如果该操作原子的执行,则要么执行完所有步骤,要么一步也不执行,不可能只执行所有步骤的一个子集. 向打开文件时设置O_APPEND标志的文件写入是原子操作.内核每次对这种文件进行写之前,都将进程的当前偏移量设置到该文件的尾端处. O_EXCL | O_CREAT 是一个原子操作.如果文件已存在,则出错.否则,创建文件. dup/dup2两个函数都用于复制一个现存的文件描述符: #include<unistd.h> int du

dup/dup2输出重定向

函数原型:#includeint dup(int oldfd);int dup2(int oldfd,int newfd);dup用来复制oldfd所指的文件描述符.但复制成功时返回最小的尚未被使用的文件描述符.若有错误则返回-1,错误代码存入errno中.返回的新文件描述符和参数oldfd指向同一个文件,共享所有的锁定,读写指针,和各项权限或标志位..h> 1.打开一个新文件.h> 2.关掉标准输出文件符.h> 3.调用dup给文件描述符.h> 4.此时文件描述符变为1.h>

linux之dup和dup2函数解析

1. 文件描述符在内核中数据结构在具体说dup/dup2之前,我认为有必要先了解一下文件描述符在内核中的形态.一个进程在此存在期间,会有一些文件被打开,从而会返回一些文件描述符,从shell中运行一个进程,默认会有3个文件描述符存在(0.1.2), 0与进程的标准输入相关联,1与进程的标准输出相关联,2与进程的标准错误输出相关联,一个进程当前有哪些打开的文件描述符可以通过/proc/进程ID/fd目录查看. 下图可以清楚的说明问题:进程表项 ---------------- fd标志 文件指针

《APUE》中的函数整理

第1章 unix基础知识 1. char *strerror(int errnum) 该函数将errnum(就是errno值)映射为一个出错信息字符串,返回该字符串指针.声明在string.h文件中. 2.void perror(const char *s) 该函数基于当前的errno值,在标准出错文件中输出一条出错消息,然后返回.声明在stdio.h文件中.它首先输出由s指向的字符串,然后是一个冒号,一个空格,接着是errno值对应的出错信息,最后是一个换行符. 第2章 UNIX标准化及实现

dup和dup2函数

dup和dup2也是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符.它们经常用来重定向进程的stdin.stdout和stderr.这两个函数的原形如下: #include <unistd.h> int dup( int oldfd ); int dup2( int oldfd, int targetfd ); dup()函数 利用函数dup,我们可以复制一个描述符.传给该函数一个既有的描述符,它就会返回一个新的描述符,这个新的描述符是传给它的描述符的拷贝.这意味着,这两个描述符共