高级I/O函数(3)-tee、fcntl函数

tee函数使用

功能描述:tee函数在两个管道文件描述符之间复制数据,也是零拷贝操作.它不消耗数据,因此源文件描述符仍然可以用于后续的操作.

函数原型:

#include <fcntl.h>
 ssize_t tee(int fd_in,int fd_out,size_t len,unsigned int flags);

函数参数:fd_in和fd_out必须都是管道文件描述符。

返回值:成功时返回在两个文件描述符之间复制的数据字节数,返回0表示没有复制任何数据.失败时返回-1并设置errno.

下面是利用tee函数和splice函数,实现同时输出数据到终端与文件的程序)的基本功能.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <errno.h>
#include <fcntl.h>

int main(int argc,const char* argv[]){
    if(argc<=2){
        printf("usage:%s <file>\n",argv[0]);
        exit(-1);
    }

    int filefd=open(argv[1],O_WRONLY|O_CREAT|O_TRUNC,0666);
    assert(filefd>=0);

    int pipefd_stdout[2];
    int ret=pipe(pipefd_stdout);
    assert(ret!=-1);

    int pipefd_file[2];
    ret=pipe(pipefd_file);
    assert(ret!=-1);

    /*将标准输入内容输入管道文件pipefd_stdout*/
    ret=splice(STDIN_FILENO,NULL,pipefd_stdout[1],NULL,32768,SPLICE_F_MORE
                                    |SPLICE_F_MOVE);
    assert(ret!=-1);

    /*将管道pipefd_stdout[0]输出复制到管道pipefd_file的输入端*/
    ret=tee(pipefd_stdout[0],pipefd_file[1],32768,SPLICE_F_NONBLOCK);
    assert(ret!=-1);
    /*将管道pipefd_file的输出定向到文件描述符filefd上*/
    ret=splice(pipefd_file[0],NULL,filefd,NULL,32768,SPLICE_F_MORE|
                                    SPLICE_F_MORE);
    assert(ret!=-1);
    /*将管道pipefd_stdout的输出定向到标准输出,其内容与文件中完全一致*/
    ret=splice(pipefd_stdout[0],NULL,STDOUT_FILENO,NULL,32768,SPLICE_F_MORE|
                                        SPLICE_F_MOVE);
    assert(ret!=-1);

    close(filefd);
    close(pipefd_file[0]);
    close(pipefd_file[1]);
    close(pipefd_stdout[0]);
    close(pipefd_stdout[1]);
    return 0;
}

fcntl函数的使用

功能描述:常用于控制文件描述符的属性和行为

函数原型:

#include <fcntl.h>
int fcntl(int fd,int cmd,...);

fd是被操作的文件描述符,cmd参数指定执行何种类型的操作.根据操作类型的不同,该函数可能还需要第三个可选参数.

fcntl支持的常用操作及其参数

操作分类 操作 含义 第三个参数的类型 成功时的返回值
复制文件描述符 F_DUPFD 创建一个新的文件描述符,其值大于或等于arg long 新创建的文件描述符的值
F_DUPFD_CLOEXEC 与F_DUPFD相似,不过在创建文件描述符的同时,设置其close_on_exec标志 long 新创建的文件描述符的值
获取和设置文件描述符的标志 F_GETFD 获取fd的标志 fd的标志
F_SETFD 设置fd的标志 long 0
获取和设置文件描述符的状态标志 F_GETFL 获取fd的状态标志,这些标志包括可由open系统调用设置的标志(O_CREAT、O_APPEND等)和访问模式(O_RDONLY、O_WRONLY和O_RDWR) void fd的状态标志
F_SETFL 设置fd的状态标志,但部分标志是不能修改的(比如访问模式标志) long 0
管理信号 F_GETOWN 获得SIGIO和SIGURG信号的宿主进程的PID或进程组的ID 信号的宿主进程或者进程组ID
F_SETOWN 设定SIGIO和SIGURG信号的宿主进程的PID和进程组的ID long  0
F_GETSIG 获取当应用程序被通知fd可读或可写时,是哪个信号通知该事件的 信号值
F_SETSIG 设置当fd可读或可写时,系统应该触发哪个信号来通知应用程序 long 0
操作管道容量 F_SETPIPE 设置由fd指定的管道的容量 long 0
F_GETPIPE 获取由fd指定的管道的容量 管道容量
时间: 2024-10-06 18:46:42

高级I/O函数(3)-tee、fcntl函数的相关文章

0723------Linux基础----------文件 IO 之 dup、dup2 和 fcntl 函数

1. dup 函数 1.1 dup 函数用来复制一个文件描述符,复制后的文件描述符可以正常使用(见例1).dup函数返回当前文件描述符表中一个最小的可用的文件描述符(Linux下分配文件描述符的规则是:寻找最小可用),这个过程由系统来完成.dup函数成功执行后,两个文件描述符fd_1 和 fd_2 指向同一个文件表项,因它们共享偏移量(文件数据结构图见Unix环境高级编程),在内核中的数据结构表示为:1个进程表项,1个文件表项(这里两个文件描述符指向同一个文件表项),1个V结点.文件表项中有一个

第七篇:使用 fcntl 函数 获取,设置文件的状态标志

前言 当打开一个文件的时候,我们需要指定打开文件的模式( 只读,只写等 ).那么在程序中如何获取,修改这个文件的状态标志呢?本文将告诉你如何用 fcntl函数 获取指定文件的状态标志. 解决思路 1. 对于获取文件状态标志,我们可以通过调用fcntl函数得到一个记录文件标志的整型变量,然后分别让它和各个状态标志常量进行&操作.若操作结果为正则文件具有此状态标志,否则文件没有此状态标志.( 如果是检查只读,只写,可读可写,则需要和ACCMODE相&,然后判断其结果是否为O_RDONLY,O_

【UNIX环境高级编程】文件 IO 操作 - 基础函数 open close creat lseek write read 详解

博客地址 : http://blog.csdn.net/shulianghan/article/details/46980271 一. 文件打开关闭操作相关函数介绍 1. open 函数 (1) open 函数简介 open 函数解析 : -- 函数定义 : #include <fcntl.h> int open(const char *path, int oflag, ...); -- 函数作用 : 打开或者创建一个文件; -- 返回值 : 打开文件成功, 返回文件描述符; 如果失败, 返回

UNIX环境编程学习笔记(5)——文件I/O之fcntl函数访问已打开文件的性质

lienhua342014-08-29 fcntl 函数可以改变已打开的文件的性质. #include <fcntl.h> int fcntl(int filedes, int cmd, ... /* int arg */); fcntl 函数有 5 种功能: 1. 复制一个现有的描述符(cmd=F_DUPFD). 2. 获取/设置文件描述符标志(cmd=F_GETFD 或F_SETFD). 3. 获取/设置文件状态标志(cmd=F_GETFL 或F_SETFL). 4. 获取/设置异步 I/

fcntl函数详解

功能描述:根据文件描述词来操作文件的特性. 文件控制函数          fcntl -- file control头文件: #include <unistd.h> #include <fcntl.h> 函数原型: int fcntl(int fd, int cmd); int fcntl(int fd, int cmd, long arg); int fcntl(int fd, int cmd, struct flock *lock); 描述: fcntl()针对(文件)描述符

Linux环境编程之文件I/O(五):fcntl函数

引言: 对于一个普通的文件,我们可以想到的对它的操作有,读取文件的内容.写数据到文件中,这些都是前面提到的read.write函数的作用.除此之外,还可以获取文件的其他性质,并对这些性质进行修改,比如文件的描述符.文件描述符标记.文件状态标志等等.这些对文件性质的修改就由fcntl函数完成. 函数介绍: #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd, ... /* arg */ ); 参数: fd:

fcntl 函数

设置文件的flags,阻塞设置成非阻塞,非阻塞设置成阻塞(这连个在server开发中可以封装为基本函数) 线程引入 pthread_self 和 pthread_equal 原因 --解决不同平台的问题! Mysql索引__索引的分类_索引的创建_使用alter建立索引(也可以在创建表时设定).索引的分类 fcntl即F_SETFL,F_GETFL的使用,设置文件的flags,阻塞设置成非阻塞,非阻塞设置成阻塞(这连个在server开发中可以封装为基本函数) 2010-11-26 18:02:1

文件控制 fcntl函数详解

摘要:本文主要讨论文件控制fcntl函数的基本应用.dup函数可以复制文件描述符,而fcntl函数与dup函数有着异曲同工之妙.并且还有更加强大的功能,可以获取或设置已打开文件的性质,操作文件锁. 1.fcntl函数 在<重定向编程 dup和dup2>一文中,介绍了dup和dup2两个函数,函数是提供了复制一个现存的文件描述符的功能,而本文介绍的fcntl函数提供了进一步管理文件描述符的各种手段,用它可以对以打开的描述符执行各种控制操作,比如,可以像dup和dup2一样复制一个文件描述符,还有

(待续)文件IO详解(十六)---fcntl函数详解

fcntl函数是用来在进程中实现对文件的多种操作的函数,通过不同的命令可以实现不同的操作.常用的操作有复制文件描述符.为文件设置建议锁和获取设置文件控制标志等. ======================================================= 函数原型: ======================================================= 操作一:复制文件描述符实现文件共享 函数参数: fd:要操作的文件描述符 cmd:F_DUPFD ar