今日命令:

more filenamen   //分屏显示filename 内容
od -c   filename    //使用二进制形式查看文件内容

dup和dup2也是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符。它们经常用来重定向进程的stdin、stdout和stderr。这两个函数的原形如下:

#include <unistd.h>
int dup( int oldfd );
int dup2( int oldfd, int targetfd );

利用函数dup,我们可以复制一个描述符。传给该函数一个既有的描述符,它就会返回一个新的描述符,这个新的描述符是传给它的描述符的拷贝。这意味着,这两个描述符共享同一个数据结构。例如,如果我们对一个文件描述符执行lseek操作,得到的第一个文件的位置和第二个是一样的。下面是用来说明dup函数使用方法的代码片段:

int fd1, fd2;
...
fd2 = dup( fd1 );

dup2函数跟dup函数相似,但dup2函数允许调用者规定一个有效描述符和目标描述符的id。在使用dup2的时候若第二个参数的描述符targetfd已经打开则现将其关闭, dup2函数成功返回时,目标描述符(dup2函数的第二个参数)将变成源描述符(dup2函数的第一个参数)的复制品,换句话说,两个文件描述符现在都指向同一个文件,并且是函数第一个参数指向的文件。下面我们用一段代码加以说明:

 int oldfd;oldfd = open("app_log", (O_RDWR | O_CREATE), 0644 );dup2( oldfd, 1 );close( oldfd );
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main()
{int pfds[2];if ( pipe(pfds) == 0 ) {if ( fork() == 0 ) {close(1);dup2( pfds[1], 1 );close( pfds[0] );execlp( "ls", "ls", "-l", NULL );} else {close(0);dup2( pfds[0], 0 );close( pfds[1] );execlp( "wc", "wc", "-l", NULL );}return 0;
}

//复制文件描述符并向文件写数据

#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>void main()
{int fd,newfd;char *bufFD="Advanced Programming! write by fd\n";char *bufNewFD="Advanced Programming! write by NewFD\n";fd = open("test.txt",O_RDWR|O_CREAT,0644);if(fd==-1){printf("open file error%m\n");exit(-1);}//开始复制了newfd = dup(fd);//使用fd写write(fd,bufFD,strlen(bufFD));close(fd);//使用newfd写write(newfd,bufNewFD,strlen(bufNewFD));if(close(newfd)==-1){printf("close error\n");}exit(0);
}

实现简单cat命令:实现的是无论输入多少参数都能将其转化为标准输出输出出来。

#include "io.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>int main(int argc, char * argv[])
{int fd_in = STDIN_FILENO;int fd_out = STDOUT_FILENO;int i;for(i = 1; i < argc; i ++){   //写上fro循环是为了无论输入几个命令行参数,都能够将其转换为标准输出输出出来fd_in = open(argv[i],O_RDONLY);if(fd_in < 0){perror("open error");continue;}copy(fd_in,fd_out);close(fd_in);}if(argc == 1){   copy(fd_in,fd_out);}return 0;
}

io.c文件

#include "io.h"
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>#define BUFFER_LEN 1024void copy(int fdin, int fdout)
{char buffer[BUFFER_LEN];ssize_t size;while(( size = read(fdin, buffer, BUFFER_LEN )) > 0){   printf("current %ld\n",lseek(fdin,0L,SEEK_CUR));if( write( fdout, buffer, size) != size){fprintf(stderr,"write error: %s\n",strerror(errno));exit(1);}}if(size < 0){fprintf(stderr, "read error: %s\n",strerror(errno));exit(1);}}

io.h头文件

#ifndef __IO_H
#define __IO_Hextern void copy(int fdin, int fdout);#endif

使用dup函数,打造升级版cat命令:

#include "io.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>/*
*bin/mcat + iotec.txt (+为输入重定向)
*bin/mcat - iotec.txt(-为输出重定向)
*/int main(int argc, char * argv[])
{int fd_in = STDIN_FILENO;int fd_out = STDOUT_FILENO;int flag = 0;int i;for(i = 1; i < argc; i ++){   //写上fro循环是为了无论输入几个命令行参数,都能够将其转换为标准输出输出出来if(!strcmp("+", argv[i])){fd_in = open(argv[++i],O_RDONLY);if(fd_in < 0){perror("open error");}//将标准输入重定向到文件if(dup2(fd_in, STDIN_FILENO) != STDIN_FILENO){perror("dup2 error!");exit(1);}close(fd_in);}else if(!strcmp("-",argv[i])){fd_out = open(argv[++i], O_WRONLY | O_CREAT | O_TRUNC, 0777);if(fd_out < 0){perror("open fd_out error!");exit(1);               }//将标准输出重定向到文件if(dup2(fd_out, STDOUT_FILENO) != STDOUT_FILENO){perror("dup2 error");exit(1);}}else {flag  = 1;;fd_in = open(argv[i], O_RDONLY);if(fd_in < 0){perror("open error!");exit(1);}if(dup2(fd_in ,STDIN_FILENO) != STDIN_FILENO){perror("dup2 error");exit(1);}copy(STDIN_FILENO,STDOUT_FILENO);close(fd_in);}}if(!flag){copy(STDIN_FILENO, STDOUT_FILENO);}return 0;
}

dup和dup2以及cat函数函数相关推荐

  1. dup、dup2实现文件描述符重定向(标准输入、标准输出、标准错误输出)

    目录 dup函数 dup2函数 重定向标准输入 重定向标准输出 重定向标准错误输出 重定向恢复 总结 在前文中,可以知道,文件描述符实际上是指向文件表项的指针数组索引,也就相当于每个文件描述符都对应一 ...

  2. linux之dup和dup2函数解析

    理论介绍: 1. 文件描述符在内核中数据结构 在具体说dup/dup2之前,我认为有必要先了解一下文件描述符在内核中的形态.一个进程在此存在期间,会有一些文件被打开,从而会返回一些文件描述符,从she ...

  3. linux存储--dup和dup2函数解析(十八)

    1.文件描述符在内核中数据结构 在具体说dup/dup2之前,我认为有必要先了解一下文件描述符在内核中的形态.一个进程在此存在期间,会有一些文件被打开,从而会返回一些文件描述符,从shell中运行一个 ...

  4. Linux的dup与dup2函数

    dup函数 函数原型: int dup(int oldfd); 作用: 复制oldfd,返回新的文件描述符,这两个文件描述符执行相同的系统资源,而且新的文件描述符是操作系统给进程分配没有用到的数字最小 ...

  5. linux dup用法,Linux:dup和dup2文件描述符及函数解析,dupdup2

    Linux:dup和dup2文件描述符及函数解析,dupdup2 一.文件描述符 1.1 文件描述符概念 我们知道在Linux下一切皆文件,因此我们需要一个东西对这些文件进行管理,此时就需要文件描述符 ...

  6. dup和dup2函数

    dup和dup2函数 dup和dup2用于复制文件描述符,通常用于重定向. #include <unistd.h>int dup(int oldfd); int dup2(int oldf ...

  7. linux文件重定向 dup,linux之dup和dup2函数解析

    linux之dup和dup2函数解析 linux之dup和dup2函数解析 系统调用dup和dup2能够复制文件描述符.dup返回新的文件文件描述符(没有用的文件描述符最小的编号).dup2可以让用户 ...

  8. c语言 字符串dup,C语言中dup和dup2函数的不同和使用

    在unix高级编程中有介绍dup和dup2,但是没有实例说明, 笔者自己结合实例进行了测试了解. 在linux下,通过open打开以文件后,会返回一个文件描述符,文件描述符会指向一个文件表,文件表中的 ...

  9. 九、Linux之dup和dup2函数

    九.Linux之dup和dup2函数 目录: 九.Linux之dup和dup2函数 一.重定向 二.dup()函数原型(dup--duplicate) int dup(int oldfd); 三.du ...

最新文章

  1. centos7中使用yum安装tomcat mysql 等
  2. linux命令pwd
  3. 数据结构实验之栈与队列一:进制转换
  4. CodeForces - 1543D1 RPD and Rap Sheet (Easy Version)(异或+交互)
  5. 用计算机演奏打上花火,米津玄师打上花火歌词中文谐音(最好要简单全面)
  6. TypeScript类型推论(Type Inference)
  7. hive安装需要安装mysql区别_HIVE安装系列之一:在Linux中安装mysql,为其作为hive的metastore做准备...
  8. 怎样才能有德国煤矿那样严密的安全网?
  9. java get请求 数组,浅谈vue中get请求解决传输数据是数组格式的问题
  10. htaccess 是什么
  11. react native 处理iOS和安卓系统文字
  12. react.js学习笔记02
  13. 使用easy_captcha生成登录验证码
  14. Jsoup爬虫获取公司纳税识别号
  15. 大三了,我真的好迷茫
  16. GPU编程与CG语言之阳春白雪下里巴人.pdf 分享
  17. 学好MySQL增删查改,争取不做CURD程序员【下篇(六个小时肝MySQL万字大总结)】
  18. springboot整合RabbitMQ启动报错:An unexpected connection driver error occured,Socket Closed
  19. PXE和Cobble实现自动装机
  20. Vistual Studio Code中Markdown使用数学公式

热门文章

  1. Windows系统进程全解剖
  2. NYOJ 5287 异 形 卵
  3. poj 3280(简单区间dp)
  4. hdu 2473(并查集+删除操作)
  5. hdu 4417(树状数组+离线算法)
  6. nyoj 42 一笔画问题 (搜索+队列)
  7. js面向对象编程:this究竟代表什么?第二篇
  8. StringUtils类中 isEmpty() 与 isBlank()的区别
  9. 关于事件的一点小总结
  10. C++ static、const对象声明与定义