全部博文(298)
分类: LINUX
2011-03-24 14:23:55
open函数
函数原型:
#include
int open(const char *pathname, int oflag, …/*mode_t mode*/)
返回值:若返回成功返回文件描述符(此文件描述符一定是当前可用的最小的),若出错返回-1
oflag参数多个常量进行“或”运算
oflag必要参数3选1:
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;
}