Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C linux下文件的并发访问_C_Linux_Multithreading_Concurrency_Filesystems - Fatal编程技术网

C linux下文件的并发访问

C linux下文件的并发访问,c,linux,multithreading,concurrency,filesystems,C,Linux,Multithreading,Concurrency,Filesystems,我正在研究linux中如何进行系统调用读/写,我发现: .... loff_t pos = file_pos_read(f.file); ret = vfs_read(f.file, buf, count, &pos); file_pos_write(f.file, pos); fdput(f); ...` 我的问题是: 锁到哪里去了?我会想象这样的事情: .... lock(f.file); // <-- lock file struct loff_t pos = file_

我正在研究linux中如何进行系统调用读/写,我发现:

....
loff_t pos = file_pos_read(f.file);
ret = vfs_read(f.file, buf, count, &pos);
file_pos_write(f.file, pos);
fdput(f);
...`
我的问题是:

锁到哪里去了?我会想象这样的事情:

....
lock(f.file);  // <-- lock file struct
loff_t pos = file_pos_read(f.file);
ret = vfs_read(f.file, buf, count, &pos);
file_pos_write(f.file, pos);
fdput(f);
unlock(f.file);  // <-- unlock file struct
...
。。。。

锁定(f.file);// Linux不使用任何锁定机制来保护多线程写入文件


您必须使用自己的互斥来保护文件。

在多线程应用程序中,序列化对文件描述符的访问是您的责任。跨进程,您可以使用
flock(2)
syscall同步对同一文件的访问


如果从两个不同的进程/线程访问同一个文件,内核不会崩溃,但它可能会以未定义的方式覆盖或损坏文件位置和文件数据。

这是用户空间代码?@Sibrajas:read和write是系统调用,这意味着它们的实现在内核内部。(除了vdso和VSYSCALL之外,但是不要担心)这个关于强制锁定的链接可能有用@是的,我知道。我只是被这篇文章误导了。系统调用读/写是如何完成的(在第一行)。它可以在实现时进行编辑。可能的重复项是posix如何指定的?所有UNIX内核都做同样的事情吗?