标签:
摘要:本文主要讨论文件控制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://www.cnblogs.com/gcczhongduan/p/4285938.html