Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2373946
  • 博文数量: 298
  • 博客积分: 7876
  • 博客等级: 准将
  • 技术积分: 5500
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-23 13:39
文章存档

2013年(2)

2012年(142)

2011年(154)

分类: LINUX

2011-03-24 14:23:55

open函数

 

函数原型:

#include

int open(const char *pathname, int oflag, …/*mode_t mode*/)

返回值:若返回成功返回文件描述符(此文件描述符一定是当前可用的最小的),若出错返回-1

 

oflag参数多个常量进行“或”运算

oflag必要参数31

O_RDONLY      只读打开

O_WRONLY     只写打开

O_RDWR          读写打开

oflag可选参数

O_APPEND            每次写追加到文件末尾

O_CREAT         若文件不存在则创建,使用该选项时需指定第三个参数,指定文件权限

O_EXCL            如果同时指定了O_CREAT 而文件也存在则出错,如果文件不存在则创建此文件,该操作为一个原子操作

O_TRUNC         文件存在且只写或者读写打开则将文件长度截短为0

O_NOCTTY       如果pathname指定的为终端设备,则不将该设备分配为此进程的控制端

O_NONBLOCK       如果打开的是一个FIFO(命名管道),一个块特殊文件,或者一个字符特殊文件,则设置此次操作和以后的I/O操作设置为非阻塞模式

----------------------------------------------

9个访问权限位,取自

----------------------------------------------

S_IRUSR     用户-

S_IWUSR    用户-

S_IXUSR    用户-执行

-----------------------------------------------

S_IRGRP     -

S_IWGRP    -

S_IXGRP    -执行

-----------------------------------------------

S_IROTH    其他-

S_IWOTH   其他-

S_IXOTH    其他-执行

------------------------------------------------

 

例子程序1

#include

#include

#include

#include

#include

 

#define MAXNAME 256

#define BUFFSIZE 1024

int

main(int argc, char **argv)

{

    char   pathname[MAXNAME];

    int fd;

    char    buf[BUFFSIZE];

    ssize_t  size_n;

    if(argc != 2)

    {

       printf("eg should: ./a.out pathname");

       exit(-1);

    }

//  gets(pathname);/*不推荐使用,因为没指定缓冲区大小,容易溢出*/

    strcpy(pathname, argv[1]);

    printf("file name : %s\n", pathname);

    int err = 0;

    if((fd = open(pathname, O_RDWR)) == -1)  

    {

       printf("open error");

    }

    else

    {

       printf("O_RDWR");

       while((size_n = read(fd, buf, BUFFSIZE)) > 0 )

       {

           write(STDOUT_FILENO, buf, size_n);

       }

       if(size_n == -1)

       {

           printf("error: %s\n", strerror(errno));

       }

       else

       {

           printf("\nfile end !\n");

       }

       if(lseek(fd, 0, SEEK_END) == -1)

       {

          

           printf("can't seek \n");

           exit(-1);

       }

       else 

           write(fd, "test O_RDWR", 6);

        close(fd);

    }

    return 0;

}

 

例子程序2

 

#include

#include

#include

#include

#include

                                                                                      

#define MAXNAME 256

#define BUFFSIZE 1024

int

main(int argc, char **argv)

{

        char     pathname[MAXNAME];

        int      fd;

        char     buf[BUFFSIZE];

        ssize_t  size_n;

        if(argc != 2)

        {

                printf("eg should: ./a.out pathname");

                exit(-1);

        }

//      gets(pathname);/*不推荐使用,因为没指定缓冲区大小,容易溢出*/

        strcpy(pathname, argv[1]);

     printf("file name : %s\n", pathname);

        if((fd = open(pathname, O_RDWR|O_CREAT, S_IRUSR|S_IWUSR)) == -1)

        {

                printf("creat error");

        }

        else

        {

                printf("O_RDWR|O_CREAT");

                write(fd, "test O_RDWR|O_CREAT", 6);

                close(fd);

        }

        return 0;

}

 

 

阅读(898) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~