简单来说,open是UNIX系统(包括LINUX、Mac等)的系统调用函数,与c语言库函数fopen区分开来。
# include fcntl.h # include unistd.hint open (const char * pathname,intflags ); intopen (常数char * pathname,intflags,mode_t mode ); 返回值:如果成功,则返回文件描述符,否则返回-1
函数参数:
pathname :打开文件的路径名
flags :控制打开文件的模式
mode :用于设置创建文件的权限。 仅在flags中有O_CREAT时有效。
返回值:
调用成功时返回文件描述符软盘
如果调用失败,则返回-1,修正errno
flags参数详细信息: O_RDONLY :只读模式O_WRONLY :只读模式O_RDWR :可写模式
上述三种模式不能同时用于flags参数,但需要其中一种模式。 以下参数是可选的:
O_APPEND :以后每次写入文件时,都将当前文件偏移量设置为文件末尾,但在读取文件时不受影响
O_CREAT :必须在文件不存在时创建,并使用mode选项。 指示对新文件的访问权限
O_EXCL :如果要打开的文件存在,将出现错误。 O_TRUNC与O_CREAT参数一起打开文件时,必须清除文件的内容
O_NOCTTY :如果打开的文件是终端设备,则不会将此设备设置为进程的控制终端
O_NONBLOCK :如果打开的文件是管道、块设备文件或字符设备文件,则后续的输入/输出操作将设置为无阻塞
o _ sync :等待每个write的物理I/O操作完成,包括通过write操作更新文件属性所需的I/O。
open函数返回的文件描述符fd必须是未使用的最小文件描述符。 利用此特性,可以更改三个文件描述符(0、1和2 )指向的文件。 默认情况下,进程打开三个文件描述符: 0、1和2,指向键盘和显示器设备文件。 如果在open之前执行close(1),然后调用open函数,则返回最小的未使用软盘,即1。
如果文件不存在并使用O_CREAT标志,即创建文件,则在创建文件时会授予文件一定的权限,但此权限并不限制在过程后对该文件的操作。 例如,如果创建文件时授予的权限为0555,则所有用户都没有写入的权限。 但是,可以在程序之后向文件进行写入。
如果以八进制形式给出了mode参数,要纠正错误(例如0777.),以前我认为权限数字前的0表示八进制的含义,但实际情况并非如此。 前面的0表示权限限定位,即set-user-id位、set-group-id位和sticky位这3位权限。
打开和打开的区别
如果以可写方式fopen文件,如果该文件不存在,则会自动创建该文件;但是,如果要打开该文件,则必须显式O_CREAT。 如果不存在,则以错误返回
# include stdlib.h # include stdio.h # include string.h # include fcntl.h # include unistd.hint main (const char * msg=' ) char buf[128]={0}; FD=open(test.txt ),O_WRONLY|O_CREAT|O_APPEND,0666 ); if(FD0 ) Perror ) ' open '; 退出(1; }write(FD、msg、Strlen ) (msg ); 关闭(软盘); FD=open('test.txt ',O_RDONLY ); if(FD0 ) Perror ) ' open '; 退出(1; }读取(FD、buf、sizeof ) buf ); printf(read:%s )、buf ); 返回0; }