unix:dup与dup2函数详解
dup操作
功能:复制文件描述符,重定向输入输出。
函数:
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);返回值:成功:dup函数返回当前系统可用的最小整数值。dup2函数返回第一个不小于newfd的整数值,分两种情况:1. 如果newfd已经打开,则先将其关闭,再复制文件描述符;2. 如果newfd等于oldfd,则dup2函数返回newfd,而不关闭它。失败:dup和dup2函数均返回-1,并设置errno。
复制文件描述符后,新旧文件描述符的特点:
1、使用dup或dup2复制文件描述符后,新文件描述符和旧文件描述符指向同一个文件,
管道或网络连接,共享文件的锁定、读写位置和各项权限。
2、当关闭新的文件描述符时,通过旧文件描述符仍可操作文件。
3、当关闭旧的文件描述符时,通过新的文件描述符仍可操作文件。
注意:
是共享文件偏移量和文件状态标志。
比如:其中一个使用lseek修改文件偏移量,另一个也会改变(读写等操作位置会改变)。
/* 例子:复制文件描述符,并向文件写数据 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>void main()
{int oldfd,newfd;char *oldstr = "Write by oldfd.\n";char *newstr = "Write by newfd.\n";oldfd = open("test.txt", O_RDWR|O_CREAT, 0644);printf("oldfd = %d\n", oldfd);if(oldfd == -1) {printf("File open error\n");exit(-1); }/* 开始复制 */newfd = dup(oldfd);printf("newfd = %d\n", newfd);/* 使用oldfd写 */write(oldfd, oldstr, strlen(oldstr));if(close(oldfd) == -1) {printf("Close oldfd error.\n");exit(-1);}/* 使用newfd写 */write(newfd, newstr, strlen(newstr));if(close(newfd) == -1) {printf("Close newfd error.\n");exit(-1);}exit(0);
}
执行结果
终端输出:
oldfd = 3
newfd = 4查看test.txt:
Write by oldfd.
Write by newfd.
注意:新旧文件描述符是共享文件读写位置。
unix:dup与dup2函数详解相关推荐
- linux c——dup( )和dup2( )函数详解
dup()函数和dup2()函数书上在文件操作那一章,已经讲过了,这周看重定向这块,发现它挺重要,就再看了回,记录下. 1. dup函数 头文件及函数定义: #include <unistd.h ...
- unix环境高级编程之 read与write 函数详解
学习记录:unix环境高级编程之 read 与write 函数详解 备注:本博文非本人所写,本人觉得此文讲的非常地道通俗易懂,所以摘录在此以方便以后再次查看 read函数从打开的设备或文件中读取数据 ...
- Linux 文件锁 fcntl 函数详解
Linux 文件锁 fcntl 函数详解 #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd); ...
- linux内核中send与recv函数详解
Linux send与recv函数详解 1.简介 #include <sys/socket.h> ssize_t recv(int sockfd, void *buff, size_t n ...
- linux send与recv函数详解
linux send与recv函数详解 1 #include <sys/socket.h> 2 ssize_t recv(int sockfd, void *buff, size_t nb ...
- mysql日期时间操作函数详解
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. win7可以设定每周从哪一天开始,win2003等不能方便的修改.有的是周日开始,有的是周一开始.而 ...
- linux Socket send与recv函数详解
转自:http://www.cnblogs.com/blankqdb/archive/2012/08/30/2663859.html linux send与recv函数详解 1 #include &l ...
- gets和fgets函数及其区别,C语言gets和fgets函数详解
gets和fgets函数及其区别,C语言gets和fgets函数详解 每当讨论 gets 函数时,大家不由自主地就会想起 1988 年的"互联网蠕虫",它在 UNIX 操作系统的 ...
- execvp函数详解_如何在C / C ++中使用execvp()函数
execvp函数详解 In this article, we'll take a look at using the execvp() function in C / C++. 在本文中,我们将介绍如 ...
最新文章
- Windows Live Writer发布测试
- JavaScript学习笔记 - 入门篇(1)- 准备
- ruby on rails 学习笔记
- 窗体和控件使用中的注意事项有哪些?
- POJ1321 棋盘问题
- MyDAL - .IsExistAsync() 使用
- linux修改jdk环境变量6,Linux CentOS 6.5 使用自带jdk修改环境变量(示例代码)
- 【修饰符】四种访问修饰符和各自的权限
- pthread_t描述说明
- jackson 序列化_jackson序列化与反序列化的应用实践
- 洗礼灵魂,修炼python(42)--巩固篇—type内置函数与类的千丝万缕关系
- 史上最详 Thymeleaf 使用教程
- 上海电力学院linux大作业,上海电力电路大作业2重点.docx
- 微信公众号H5支付遇到的那些坑
- 计算机二级office高级应用教程,2015计算机二级Office高级应用上机试题及答案
- php推荐位调用,推荐位数据循环调用
- matlab画收敛域,第二章习题与答案1.求以下序列的z变换并画出零极点图和收敛域.doc...
- VIP邮箱哪个最好用?怎么申请163电子邮箱?
- Glide,AndroidX包兼容问题
- 超好的包体积优化教程,不仅仅是优化