《朱老师物联网大讲堂》学习笔记
学习地址:www.zhulaoshi.org
上节讨论的前提是文件存在,进而讨论那些内容,
那如果文件不存在呢?
当我们去打开一个并不存在的文件时,
就会文件打开错误的!
O_CREAT, 创建并打开,
fd = open("a.txt", O_RDWR | O_CREAT );
那如果文件存在,还这样做会怎杨?
试试,
原来的文件会被删除,然后重新创建一个,
说到这里,你又没发现这样做可能存在的隐患?
于是就有了这种用法,
fd = open( "a.txt", O_RDWR | O_CREAT | O_EXCL );
当文件存在时候,就会报错,
ps:这里创建出来的文件,权限和其它有些不一样,如何控制呢?
fd = open( "a.txt", O_RDWR | O_CREAT | O_EXCL ,0666 );
0666代表创建一个可读可写不可执行的文件,
O_NONBLOCK
阻塞有非阻塞,
调用一个阻塞式函数,那调用这个函数的进程可能被卡主,需要等待需要的条件具备才可能执行,
调用一个非阻塞式的函数,那调用这个函数会立即返回,不过它到底完成任务没,就不知道了,因为它不愿意等啊,
打开文件默认就是阻塞式的,如果想非阻塞就加O_NONBLOCK,
阻塞和非阻塞,是对设备文件来说的,普通文件没有这些。
O_NONBLOCK or O_NDELAY
When possible, the file is opened in nonblocking mode. Neither
the open() nor any subsequent operations on the file descriptor
which is returned will cause the calling process to wait. For
the handling of FIFOs (named pipes), see also fifo(7). For a
discussion of the effect of O_NONBLOCK in conjunction with
mandatory file locks and with file leases, see fcntl(2).
O_SYNC
操作系统层,有个缓冲区,
没有这个标志的时候,write只是将内容写入到底层的缓冲区,在合适的时候才会将buf中的内容,同步写入硬盘中,
如果不想等待,就加O_SYNC标志,
O_SYNC The file is opened for synchronous I/O. Any write(2)s on the
resulting file descriptor will block the calling process until
the data has been physically written to the underlying hardware.
But see NOTES below.