- 论坛徽章:
- 1
|
有时间测试一下。
能不能说一下为什么会交错呢?
-------------
sys_write磁盘文件不具有原子性。
writ ...
思一克 发表于 2010-10-19 16:35 ![]()
感觉还是有点问题。
请看:
asmlinkage ssize_t sys_write(unsigned int fd, const char __user * buf, size_t count)
{
struct file *file;
ssize_t ret = -EBADF;
int fput_needed;
file = fget_light(fd, &fput_needed);
if (file) {
loff_t pos = file_pos_read(file);
ret = vfs_write(file, buf, count, &pos);
file_pos_write(file, pos);
fput_light(file, fput_needed);
}
return ret;
}
ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_t *pos)
{
struct inode *inode = file->f_dentry->d_inode;
ssize_t ret;
if (!(file->f_mode & FMODE_WRITE))
return -EBADF;
if (!file->f_op || (!file->f_op->write && !file->f_op->aio_write))
return -EINVAL;
ret = locks_verify_area(FLOCK_VERIFY_WRITE, inode, file, *pos, count);
if (!ret) {
ret = security_file_permission (file, MAY_WRITE);
if (!ret) {
if (file->f_op->write)
ret = file->f_op->write(file, buf, count, pos);
else
ret = do_sync_write(file, buf, count, pos);
if (ret > 0)
dnotify_parent(file->f_dentry, DN_MODIFY);
}
}
return ret;
}
从上面源码可以看出:
1.locks_verify_area是对文件某部分的区域锁,如果两次write()的时候,不是在文件同一个区域的话,应该就不会有问题,即不会出现交叉出错的情况
2.如果两次write()的时候,是在文件同一个区域的话,那么应该会出现交叉出错或者覆盖的情况。
loff_t pos = file_pos_read(file);
ret = vfs_write(file, buf, count, &pos);
file_pos_write(file, pos);
可以从粗体的部分可以看出。
不知道是不是这样? |
|