读本文章前,必须先有一些通过I/O模型的系统调用的基础,即 open() , create() , read() , write() , close() , lseek() 函数的调用。
原子操作
在文件读写中,很容易有多个进程读取同一文件的情况,这时候竞争状态便不可避免。文件I/O的函数提供的一些参数配合系统调用的原子性很好的解决了这个问题。
来看一个关于竞争创建者的例子:
int main(int argc, char *argv[])
{
int fd;
fd = open(argv[1], O_WRONLY); /*只写形式打开文件,若指定文件不存在则打开错误*/
if(fd != -1)
{
printf("[PID %ld] File \"%s\" already exits", (long)getpid(), argv[1]);
close(fd);
}
else
{
if( errno == ENOENT ) /*ENOENT错误指代文件不存在*/
{
printf("[PID %ld] File \"%s\" doesn't exits yet\n", (long)getpid(), argv[1]);
if(argc > 2) {
sleep(5);
printf("[PID%ld] Done sleeping\n", (long)getpid());
}
fd = open(argv[1], O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR); /*加入参数O_CREAT,文件不存在则创建*/
if(fd == -1)
{
printf("创建失败\n");
}
printf("[PID %lld] Created file \"%s\" exclusively\n", (long)getpid(), argv[1</