请教一个linux函数的问题

hellodudu 2007-10-08 07:12:46
int fd_copy(to,from)
int to;
int from;
{
if (to == from) return 0;
if (fcntl(from,F_GETFL,0) == -1) return -1;
close(to);
if (fcntl(from,F_DUPFD,to) == -1) return -1;
return 0;
}

=====================
此函数中的fcntl函数有点不太明白到底干什么的,网上说第二个参数F_GETFL的话就取得文件描述词状态旗标,这个所谓的状态旗标是什么呢?
还有就是第一个和第二个fcntl函数的flag不同,作用有什么区别吗?
...全文
158 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
john11223 2009-01-16
  • 打赏
  • 举报
回复
kjo

hellodudu 2007-10-10
  • 打赏
  • 举报
回复
刚在网上找到了一些解释
fcntl(from,F_DUPFD,to)函数作用和楼上说的差不多,其作用为创建一个新的很像原型的文件描述符,也就是创建一个很类似from的to文件描述符

原帖地址
http://www.linuxdiyf.com/viewarticle.php?id=49529
hefuhua 2007-10-10
  • 打赏
  • 举报
回复
"F_DUPFD用来查找大于或等于参数arg的最小且仍未使用的文件描述词,并且复制参数fd的文件描述词。执行成功则返回新复制的文件描述词。
int fcntl(int fd,int cmd,long arg);
"

fcntl(from,F_DUPFD,to)
根据上面这段话和大家讨论猜测这个语句意思:
假设from=open("/tmp/temp1",O_RDONLY);to=open("/tmp/temp2",,O_WRONLY|O_CREAT);假设from=4,to=5,那么fcntl(from,F_DUPFD,to)=6,相当于open("/tmp/temp1",O_RDONLY) = 6;以后的地方可以直接使用6来进行文件O_RDONLY只读操作;

假设from=5,to=4,那么fcntl(from,F_DUPFD,to)还是6

fd的文件描述词理解成相当于open返回的正确的那个值,我的上面的这些凹口的字面意思的理解,没有验证:)
hellodudu 2007-10-09
  • 打赏
  • 举报
回复
那这整个函数的意思是不是可以这样来理解
先取得from文件的状态(如可读或不可读),然后从from文件中拷贝一些东西(fd的文件描述词--到底什么东西??)到to文件中。
hefuhua 2007-10-09
  • 打赏
  • 举报
回复
flag=fcntl(from,F_GETFL,0)
我是这样理解的from就是调用open()返回的文件描述词状态旗标,根据命令F_GETFL它就不用到后面的参数,所以设个0,如果其它的F_DUPFD需要后面的参数的,如果flag=-1就错误,我们可以通过flag & O_RDONLY得出是否以O_RDONLY打开的文件..这个作用我想就是不知道文件是以什么方式打开的,只要我们得出文件描述词状态旗标就知道它是什么方式打开的,应该用于网络和进程之际的吧

有该函数的源码就好了:)
hellodudu 2007-10-09
  • 打赏
  • 举报
回复
还是有很多的不明白。

if (fcntl(from,F_GETFL,0) == -1) return -1;
这一句的fcntl函数作用为取得文件描述词状态旗标(我个人认为所谓的文件描述词是不是就是指fd文件的名字?),而这些旗标就是open()参数的flags,也就是hefuhua兄所列出来的那一长串,这个函数的第三个参数是0,能和它匹配上的函数原型声明也只有
int fcntl(int fd,int cmd,long arg); 而已。那么,第三个参数是0是什么意思呢?和第二个fcntl函数中的第三个参数为to有何区别呢?

还有一个问题就是fcntl(from,F_GETFL,0)取得文件描述此状态旗标,可是这个函数返回值只有0和1,flags存放在哪里呢?
cceczjxy 2007-10-09
  • 打赏
  • 举报
回复
F_DUPFD用来查找大于或等于参数arg的最小且仍未使用的文件描述词,并且复制参数fd的文件描述词。执行成功则返回新复制的文件描述词。

===========================================
文件描述词又是什么..



--------------------------------
应该是文件句柄或则文件描述符
hefuhua 2007-10-08
  • 打赏
  • 举报
回复
F_DUPFD用来查找大于或等于参数arg的最小且仍未使用的文件描述词,并且复制参数fd的文件描述词。执行成功则返回新复制的文件描述词。

===========================================
文件描述词又是什么..
hefuhua 2007-10-08
  • 打赏
  • 举报
回复
跟楼主一起学习下

http://www.chinaunix.net/jh/23/267304.html
F_GETFL 取得文件描述词状态旗标,此旗标为open()参数flags。

http://man.chinaunix.net/develop/c&c++/linux_c/default.htm
open()
下列是参数flags 所能使用的旗标:
O_RDONLY 以只读方式打开文件
O_WRONLY 以只写方式打开文件
O_RDWR 以可读写方式打开文件。上述三种旗标是互斥的,也就是不可同时使用,但可与下列的旗标利用OR(|)运算符组合。
O_CREAT 若欲打开的文件不存在则自动建立该文件。
O_EXCL 如果O_CREAT 也被设置,此指令会去检查文件是否存在。文件若不存在则建立该文件,否则将导致打开文件错误。此外,若O_CREAT与O_EXCL同时设置,并且欲打开的文件为符号连接,则会打开文件失败。
O_NOCTTY 如果欲打开的文件为终端机设备时,则不会将该终端机当成进程控制终端机。
O_TRUNC 若文件存在并且以可写的方式打开时,此旗标会令文件长度清为0,而原来存于该文件的资料也会消失。
O_APPEND 当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面。
O_NONBLOCK 以不可阻断的方式打开文件,也就是无论有无数据读取或等待,都会立即返回进程之中。
O_NDELAY 同O_NONBLOCK。
O_SYNC 以同步的方式打开文件。
O_NOFOLLOW 如果参数pathname 所指的文件为一符号连接,则会令打开文件失败。
O_DIRECTORY 如果参数pathname 所指的文件并非为一目录,则会令打开文件失败。
此为Linux2.2以后特有的旗标,以避免一些系统安全问题。参数mode 则有下列数种组合,只有在建立新文件时才会生效,此外真正建文件时的权限会受到umask值所影响,因此该文件权限应该为(mode-umaks)。
S_IRWXU00700 权限,代表该文件所有者具有可读、可写及可执行的权限。
S_IRUSR 或S_IREAD,00400权限,代表该文件所有者具有可读取的权限。
S_IWUSR 或S_IWRITE,00200 权限,代表该文件所有者具有可写入的权限。
S_IXUSR 或S_IEXEC,00100 权限,代表该文件所有者具有可执行的权限。
S_IRWXG 00070权限,代表该文件用户组具有可读、可写及可执行的权限。
S_IRGRP 00040 权限,代表该文件用户组具有可读的权限。
S_IWGRP 00020权限,代表该文件用户组具有可写入的权限。
S_IXGRP 00010 权限,代表该文件用户组具有可执行的权限。
S_IRWXO 00007权限,代表其他用户具有可读、可写及可执行的权限。
S_IROTH 00004 权限,代表其他用户具有可读的权限
S_IWOTH 00002权限,代表其他用户具有可写入的权限。
S_IXOTH 00001 权限,代表其他用户具有可执行的权限。

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧