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<=){
printf("usage:%s <file>\n",argv[]);
exit(-);
} int filefd=open(argv[],O_WRONLY|O_CREAT|O_TRUNC,);
assert(filefd>=); int pipefd_stdout[];
int ret=pipe(pipefd_stdout);
assert(ret!=-); int pipefd_file[];
ret=pipe(pipefd_file);
assert(ret!=-); /*将标准输入内容输入管道文件pipefd_stdout*/
ret=splice(STDIN_FILENO,NULL,pipefd_stdout[],NULL,,SPLICE_F_MORE
|SPLICE_F_MOVE);
assert(ret!=-); /*将管道pipefd_stdout[0]输出复制到管道pipefd_file的输入端*/
ret=tee(pipefd_stdout[],pipefd_file[],,SPLICE_F_NONBLOCK);
assert(ret!=-);
/*将管道pipefd_file的输出定向到文件描述符filefd上*/
ret=splice(pipefd_file[],NULL,filefd,NULL,,SPLICE_F_MORE|
SPLICE_F_MORE);
assert(ret!=-);
/*将管道pipefd_stdout的输出定向到标准输出,其内容与文件中完全一致*/
ret=splice(pipefd_stdout[],NULL,STDOUT_FILENO,NULL,,SPLICE_F_MORE|
SPLICE_F_MOVE);
assert(ret!=-); close(filefd);
close(pipefd_file[]);
close(pipefd_file[]);
close(pipefd_stdout[]);
close(pipefd_stdout[]);
return ;
}

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指定的管道的容量 无 管道容量

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

  1. UNIX环境高级编程——记录上锁(fcntl函数)以及死锁检测

    一.记录锁 record locking 功能:当一个进程正在读或修改文件的某个部分时,它可以阻止其它进程修改同一文件区. 字节范围锁 byte-range locking 二.历史 flock函数, ...

  2. 文件I/O之fcntl函数

    fcntl函数可以改变已打开的文件的性质. #include <fcntl.h> int fcntl( int filedes, int cmd, ... /* int arg */ ); ...

  3. [Linux]fcntl函数文件锁概述

    概述 fcntl函数文件锁有几个比较容易忽视的地方: 1.文件锁是真的进程之间而言的,调用进程绝对不会被自己创建的锁锁住,因为F_SETLK和F_SETLKW命令总是替换调用进程现有的锁(若已存在), ...

  4. fcntl函数

    很多时候,当我们有多个进程要访问同一个文件的时候,为了防止多进程访问导致的不一致,我们就要考虑进程间的同步问题. fcntl是一个很强大的函数,我们可以通过它给文件的某一部分上锁 int fcntl( ...

  5. Linux文件(区域)锁函数 -- open()、fcntl()

    一.什么是文件锁定 对于锁这个字,大家一定不会陌生,因为我们生活中就存在着大量的锁,它们各个方面发挥着它的作用,现在世界中的锁的功能都可归结为一句话,就是阻止某些人做某些事,例如,门锁就是阻止除了屋主 ...

  6. linxu fcntl 函数用法 【转】

    功能描述:根据文件描述词来操作文件的特性. 文件控制函数         fcntl -- file control 头文件: #include <fcntl.h>;          i ...

  7. Linux系统编程(3)——文件与IO之fcntl函数

    linux文件I/O用:open.read.write.lseek以及close函数实现了文件的打开.读写等基本操作.fcntl函数可以根据文件描述词来操作文件. 用法: int fcntl(int ...

  8. Linux下 fcntl 函数用法说明

    功能描述:根据文件描述词来操作文件的特性. 文件控制函数         fcntl -- file control LIBRARY         Standard C Library (libc, ...

  9. UNIX网络编程——fcntl函数

    fcntl函数提供了与网络编程相关的如下特性: 非阻塞式I/O.  通过使用F_SETFL命令设置O_NONBLOCK文件状态标志,我们可以把一个套接字设置为非阻塞型. 信号驱动式I/O. 通过使用F ...

随机推荐

  1. RR区间锁 不是唯一索引,即使区间内没值,也锁

    +--------- +---------------------------------------------------------------------------------------- ...

  2. C#中实现邮件发送功能

    public static int sendmail(string to, string body,string subject) { try { int nContain = 0; ///添加发件人 ...

  3. Profile GPU rendering

    自Android 4.1引入了“Profile GPU rendering”这个开发工具以帮助分析应用程序性能并并精确定位渲染问题,Android 4.3增加了可视效果:On screen as ba ...

  4. 《A First Course in Probability》-chaper3-条件概率和独立性-贝叶斯公式、全概率公式

    设有事件A.B. 下面结合具体的题目进一步理解这种方法: Q1:保险公司认为人可以分为两类,一类易出事故,另一类则不易出事故.统计表明,一个易出事故者在一年内发生事故的概率是0.4,而对不易出事故者来 ...

  5. OpenMP与C++:事半功倍地获得多线程的好处

    来源:IIEEG 01-28-2011 在并行计算领域有一个广为流传的笑话——并行计算是未来之事并且永远都是.这个小笑话几十年来一直都是对的.一种类似的观点在计算机架构社区中流传,处理器时钟速度的极限 ...

  6. HDOJ 5073 Galaxy 数学 贪心

    贪心: 保存连续的n-k个数,求最小的一段方差... .预处理O1算期望. .. Galaxy Time Limit: 2000/1000 MS (Java/Others)    Memory Lim ...

  7. android shape的使用详解以及常用效果(渐变色、分割线、边框、半透明阴影效果等)

    shape使用.渐变色.分割线.边框.半透明.半透明阴影效果. 首先简单了解一下shape中常见的属性.(详细介绍参看  api文档 ) 转载请注明:Rflyee_大飞: http://blog.cs ...

  8. URL重写:RewriteCond指令与RewriteRule 指令格式(转)

    Rewirte主要的功能就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则表达式规范.平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等.本文将针对mod_rewrite和URL匹配的技术细 ...

  9. Quartz contention when running in load balanced environment--reference

    1.8.3 appears to have addressed this issue with a single application server. However, we're seeing t ...

  10. TabBarController创建及使用方法简介

    TabBarController创建及使用方法简介 大致讲解一下TabBarController的创建过程: 首先,我们需要一些视图,如创建UIControllerView类型的view1,view2 ...