开发者学堂课程【物联网开发- Linux 高级程序设计全套视频:Dup 文件描述符复制】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/660/detail/11030
Dup 文件描述符复制
内容介绍:
一、文件描述符的复制
二、dup 函数
一、文件描述符的复制
dup和dup2是两个非常有用的系统调用,都是用来复制一个文件的描述符,使新的文件描述符也标识旧的文件描述符所标识的文件。
Int dup(int oldfd)——dup为所要复制的文件描述符,返回新的文件描述符和oldfd都标识同一个文件,即oldfd所标识的文件。即有两个文件符代表同一个文件符。
系统分配的文件符
Int dup2(int oldfd , int newfd)——个人指配的( oldfd与newfd都代表oldfd所代表的文件,返回值成功返回newfd,失败则返回负值)
dup 和 dup2经常用来重定向进程的stdin(标准输入)、stdout(标准输出)和stderr(标准错误输出)
回顾:Is>test.txt
重定向:
用到了dup和dup2的功能。本来输出到屏幕上,而输出到文件(text.txt)中,输出方向被改变。
1为默认标准输出文件(屏幕),3代表test.txt。只需要1不代表标准输出,代表test.txt
之后printf时默认在1代表的文件中写内容,则默认写入test.txt中。所以要想printf打印的东西不在屏幕上,只需让1代表别的文件。
二、dup 函数
#include
int dup(int oldfd)
1. 功能:
复制oldfd文件描述符,并分配一个新的文件描述符,新的文件描述符是调用进程文件描述符表中最小可用的文件描述符。
2. 参数:
要复制的文件描述符oldfd。
3. 返回值:
成功—新文件描述符
失败—返回-1,错误代码存于errno中
代码如下:
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{
int fd ,new_fd;
fd=open(“./test.txt”,O_RDWR);
if(fd<0)
{
perror(“open”);
return 0;
}
close(1);
new_fd = dup(fd);
//复制文件描述符得到新的文件描述符,最小可用的为new_fd,为1从而实现重定向。
printf(“new_fd=%d\n”,new_fd);
printf(“hello world\n);
write(1,”hello kitty”,11);
return 0;
}
输出结果为:
hello kittynew fd=1
hello world
原因:“hello kitty”是用write写入的,没有缓冲。
printf打印的地方为缓冲区。先将write写到test.txt当中,然后输出new fd,再打hello world。
new fd为最小可用文件,来实现了重定向,用文件描述符复制实现重定向。