摘要:本文主要讨论文件控制fcntl函数的基本应用.dup函数可以复制文件描述符,而fcntl函数与dup函数有着异曲同工之妙.并且还有更加强大的功能,可以获取或设置已打开文件的性质,操作文件锁.
在《重定向编程 dup和dup2》一文中,介绍了dup和dup2两个函数,函数是提供了复制一个现存的文件描述符的功能,而本文介绍的fcntl函数提供了进一步管理文件描述符的各种手段,用它可以对以打开的描述符执行各种控制操作,比如,可以像dup和dup2一样复制一个文件描述符,还有获取或设置文件描述符标志(只读、只写等等),操纵文件锁.
头文件:#include <unistd.h> #include <fcntl.h>定义函数:
int fcntl(int filedes, int cmd); int fcntl(int filedes, int cmd, longarg); int fcntl(int filedes, int cmd,structflock *lock);返回值:若成功返回值依赖与cmd,若出错则返回-1.如果设置属性,正确返回0,错误返回-1;如果是读取属性,正确返回该属性值,错误返回-1.如,下例三个命令有特定的返回值:F_DUPFD、F_GETFD、F_GETFL以及F_GETOWN.
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void main()
{
int fd,newfd;
char *bufFD="Advanced Programming! write by fd\n";
char *bufNewFD="Advanced Programming! write by NewFD\n";
fd = open("test.txt",O_RDWR|O_CREAT,0644);
if(fd==-1)
{
printf("open file error%m\n");
exit(-1);
}
//开始复制了
newfd = fcntl(fd,F_DUPFD);
//使用fd写
write(fd,bufFD,strlen(bufFD));
close(fd);
//使用newfd写
write(newfd,bufNewFD,strlen(bufNewFD));
if(close(newfd)==-1)
{
printf("close error\n");
}
printf("now the content of file :\n");
system("cat test.txt");
exit(0);
}输出:dup(filedes);等价于:
fcntl(filedes, F_DUPFD, 0);而调用:
dup2(filedes,filedes2);等价于:
close(filedes2); fcntl(filesdes,F_DUPFD,filedes);注意:对于后一种情况,dup2并不完全等价于close加上fcntl.区别:
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
int accmode,val;
if(argc!=2)
{
printf("error:\n");
}
if((val=fcntl(atoi(argv[1]),F_GETFL,0))<0)
{
printf("error:%m\n");
exit(-1);
}
accmode = val & O_ACCMODE;
switch(accmode)
{
case O_RDONLY:
printf("read only\n");
break;
case O_WRONLY:
printf("write only\n");
break;
case O_RDWR:
printf("read write\n");
break;
default:
printf("unknow access mode\n");
}
exit(0);
}输出:原文:http://blog.csdn.net/u010006102/article/details/39697635