dup函数:
作用:复制文件描述符
原型:int dup(int oldfd);
oldfd是要复制的文件描述符
函数返回值:
成功返回最小且未被占用的文件描述符
失败返回-1
newfd =dup(int oldfd);
注意:在调用dup函数时,newfd和oldfd都指向了同一个文件,内核区会在内部维护一个计数,此时计数为2,当close一个文件描述符之后,这个计数会变成1,只有当计数为0时,文件才会真正被关闭。验证newfd和oldfd指向同一个文件的操作:通过oldfd写,newfd读,内容一致则可以验证指向同一个文件。
这是我写的dup.c文件来验证:
编译后可证:
因此可知:newfd和oldfd的值不一样,指向的文件一样。
dup2函数:
函数原型:int dup2(int oldfd, int newfd);
注意:当调用dup2函数时
假如newfd原先已经打开了一个文件,则会先关闭这个文件,然后会指向了和oldfd相同的文件。
若newfd原先没有打开文件,则newfd直接指向和oldfd相同的文件。
验证:打开两个文件得到newfd和oldfd,然后使用dup2函数,一个写,一个读。
这是我写的dup2.c文件
验证:
使用dup2实现重定向操作:
文件描述符表:
0为 STDIN_FILENO
1为 STDOUT_FILENO
STDPOUT_FILEIN原本是指向/dev/tty,但是调用dup2函数后,指向了fd指向的文件。我们编译后发现hello并未显示在终端上。
而是显示在了x.c里面,因此我们实现了重定向操作。
fcntl函数:
常用的操作:
1 int newfd=fcntl(fd,F_DUPFD,0); 复制一个新的文件描述符
2 int flag=fcntl(fd,F_GETFL,0);获取文件的属性标志
3 flag=flag | O_APPEND;
fcntl(fd,F_SETFL,flag); 设置文件状态标志
4 常用的属性标志:
O_APPEND->设置文件打开为末尾
O_NONBLOCK->设置打开的文件描述符为非阻塞