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。
复制文件描述符后,新旧文件描述符的特点:
- 使用dup或dup2复制文件描述符后,新文件描述符和旧文件描述符指向同一个文件,管道或网络连接,共享文件的锁定、读写位置和各项权限。
- 当关闭新的文件描述符时,通过旧文件描述符仍可操作文件。
- 当关闭旧的文件描述符时,通过新的文件描述符仍可操作文件。
注意:
是共享文件偏移量和文件状态标志。
比如:其中一个使用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.
注意:新旧文件描述符是共享文件读写位置。
版权声明:本文为weixin_42864391原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。