dup与赋值语句用于文件描述符的区别
来源:互联网 发布:揭秘淘宝刷到单流程图 编辑:程序博客网 时间:2024/06/14 06:30
转载自: http://www.cppblog.com/iuranus/archive/2009/12/22/103672.html
dup/dup2的使用请参考其他资料,个人只是想了解dup后文件描述符,进程表项,文件表的关系。
进程要对文件进行操作,一般使用open调用打开一个文件进行访问,每个进程都有一个文件描述符表,该表中存放打开的文件描述符。用户使用open等调用得到的文件描述符其实是文件描述符在该表中的索引号,该表项的内容是一个指向文件表的指针。应用程序只要使用该描述符就可以对指定文件进行操作。
为了了解dup与赋值语句用于文件描述符的区别,请看如下程序。
程序描述:
打开一个文件描述符,分别适用dup和赋值语句进行复制,复制之后,打印原始和被复制的文件描述符id,看看是否具有相同的值,然后关闭文件,测试关闭是否成功。
程序示例:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
int sys_err(char *str)
{
puts(str);
exit(0);
}
int main(void)
{
int p,q;
if((p=open("c_fid.c", O_RDONLY)) == -1)
sys_err("open error");
q = dup(p);
puts("dup:");
printf("file p,q fd is:%d %d\n", q, p);
printf("close file p ok?: %d\n", close(p));
printf("close file q ok?: %d\n", close(q));
if((p=open("c_fid.c", O_RDONLY)) == -1)
sys_err("open error");
q = p;
puts("=:");
printf("file p,q fd is:%d %d\n", q, p);
printf("close file p ok?: %d\n", close(p));
printf("close file q ok?: %d\n", close(q));
return 0;
}
程序运行结果:
dup:
file p,q fd is:4 3 //文件p,q使用不同的文件描述符
close file p ok?: 0
close file q ok?: 0 //文件关闭成功
=:
file p,q fd is:3 3 //简单复制
close file p ok?: 0
close file q ok?: -1//关闭失败,原因是此描述符已经被关闭了
由此证明,dup是产生一个新的文件描述符id和指针在进程表项中,但是他们共用文件表,这时,关闭一个文件描述符,另外一个仍旧可用,文件表并不会被释放。而赋值语句不同,它只是简单的在另外一个变量中记录原始文件指针等,2个变量的文件描述符相同,进程表项中并不产生新的项目。使用文件描述符关闭了一次后文件就真的关闭了。
- dup与赋值语句用于文件描述符的区别
- 文件描述符&dup函数
- dup 复制文件描述符
- 文件描述符 dup与dup2函数解析
- 文件描述符的重定向:dup/dup2
- 文件描述符的复制:dup()和dup2()
- dup函数:复制文件描述符
- 3.12 dup函数-文件描述符复制
- 文件描述符 dup/dup2函数
- 文件描述符和dup dup2 fcntl
- dup等复制文件描述符函数
- 文件描述符重定向---dup&dup2
- dup,dup2函数,复制文件描述符
- 文件描述符与流的区别
- 文件描述符与文件指针的区别
- 文件描述符与文件指针的区别
- Linux文件,文件描述符以及dup()和dup2()
- Linux文件,文件描述符以及dup()和dup2()
- iOS开发之基础视图—— UIStepper
- Mybatis常见错误
- C语言编程---socket基础
- ios通过字符串获取类名
- mybatis配置
- dup与赋值语句用于文件描述符的区别
- stone
- message[时间标记]
- 拓扑排序
- 第十二周第三项目——类运算的实现(运算符重载)
- Floyd 多源最短路径算法
- 最小生成树[Kruskal]
- 最小生成树[Prim]
- LinuxServer开机自动登录和自启动程序设置