dup和dup2以及cat函数函数
今日命令:
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函数函数相关推荐
- dup、dup2实现文件描述符重定向(标准输入、标准输出、标准错误输出)
目录 dup函数 dup2函数 重定向标准输入 重定向标准输出 重定向标准错误输出 重定向恢复 总结 在前文中,可以知道,文件描述符实际上是指向文件表项的指针数组索引,也就相当于每个文件描述符都对应一 ...
- linux之dup和dup2函数解析
理论介绍: 1. 文件描述符在内核中数据结构 在具体说dup/dup2之前,我认为有必要先了解一下文件描述符在内核中的形态.一个进程在此存在期间,会有一些文件被打开,从而会返回一些文件描述符,从she ...
- linux存储--dup和dup2函数解析(十八)
1.文件描述符在内核中数据结构 在具体说dup/dup2之前,我认为有必要先了解一下文件描述符在内核中的形态.一个进程在此存在期间,会有一些文件被打开,从而会返回一些文件描述符,从shell中运行一个 ...
- Linux的dup与dup2函数
dup函数 函数原型: int dup(int oldfd); 作用: 复制oldfd,返回新的文件描述符,这两个文件描述符执行相同的系统资源,而且新的文件描述符是操作系统给进程分配没有用到的数字最小 ...
- linux dup用法,Linux:dup和dup2文件描述符及函数解析,dupdup2
Linux:dup和dup2文件描述符及函数解析,dupdup2 一.文件描述符 1.1 文件描述符概念 我们知道在Linux下一切皆文件,因此我们需要一个东西对这些文件进行管理,此时就需要文件描述符 ...
- dup和dup2函数
dup和dup2函数 dup和dup2用于复制文件描述符,通常用于重定向. #include <unistd.h>int dup(int oldfd); int dup2(int oldf ...
- linux文件重定向 dup,linux之dup和dup2函数解析
linux之dup和dup2函数解析 linux之dup和dup2函数解析 系统调用dup和dup2能够复制文件描述符.dup返回新的文件文件描述符(没有用的文件描述符最小的编号).dup2可以让用户 ...
- c语言 字符串dup,C语言中dup和dup2函数的不同和使用
在unix高级编程中有介绍dup和dup2,但是没有实例说明, 笔者自己结合实例进行了测试了解. 在linux下,通过open打开以文件后,会返回一个文件描述符,文件描述符会指向一个文件表,文件表中的 ...
- 九、Linux之dup和dup2函数
九.Linux之dup和dup2函数 目录: 九.Linux之dup和dup2函数 一.重定向 二.dup()函数原型(dup--duplicate) int dup(int oldfd); 三.du ...
最新文章
- centos7中使用yum安装tomcat mysql 等
- linux命令pwd
- 数据结构实验之栈与队列一:进制转换
- CodeForces - 1543D1 RPD and Rap Sheet (Easy Version)(异或+交互)
- 用计算机演奏打上花火,米津玄师打上花火歌词中文谐音(最好要简单全面)
- TypeScript类型推论(Type Inference)
- hive安装需要安装mysql区别_HIVE安装系列之一:在Linux中安装mysql,为其作为hive的metastore做准备...
- 怎样才能有德国煤矿那样严密的安全网?
- java get请求 数组,浅谈vue中get请求解决传输数据是数组格式的问题
- htaccess 是什么
- react native 处理iOS和安卓系统文字
- react.js学习笔记02
- 使用easy_captcha生成登录验证码
- Jsoup爬虫获取公司纳税识别号
- 大三了,我真的好迷茫
- GPU编程与CG语言之阳春白雪下里巴人.pdf 分享
- 学好MySQL增删查改,争取不做CURD程序员【下篇(六个小时肝MySQL万字大总结)】
- springboot整合RabbitMQ启动报错:An unexpected connection driver error occured,Socket Closed
- PXE和Cobble实现自动装机
- Vistual Studio Code中Markdown使用数学公式