两个Unix进程能否同时写入单个文件中的不同位置?
这是我的一道未解决的考试题。 两个Unix进程能否同时写入不同的位置 在一个文件中两个Unix进程能否同时写入单个文件中的不同位置?,unix,filesystems,Unix,Filesystems,这是我的一道未解决的考试题。 两个Unix进程能否同时写入不同的位置 在一个文件中 是的,这两个进程将有自己的文件表条目 否,共享i节点包含一个偏移指针 只有一个进程具有写入权限 是的,但前提是我们使用NFS进行操作 是的,他们当然可以,但要注意以下几点: 根据open()模式,一个进程可以轻松擦除文件内容 根据调度,写入操作的顺序是不确定的 没有强制锁定(通常)-谨慎的设计要求建议锁定 如果它们使用缓冲I/O在同一区域中写入,则结果可能是不确定的 是的,他们当然可以,但要注意以下几点: 根
是的,他们当然可以,但要注意以下几点:
- 根据
模式,一个进程可以轻松擦除文件内容open()
- 根据调度,写入操作的顺序是不确定的
- 没有强制锁定(通常)-谨慎的设计要求建议锁定
- 如果它们使用缓冲I/O在同一区域中写入,则结果可能是不确定的
- 根据
模式,一个进程可以轻松擦除文件内容open()
- 根据调度,写入操作的顺序是不确定的
- 没有强制锁定(通常)-谨慎的设计要求建议锁定
- 如果它们使用缓冲I/O在同一区域中写入,则结果可能是不确定的
- 索引节点中没有记录文件偏移量,因此回答2。这是不正确的
- 没有文件证明流程修改其访问权限的原因so 3。这是不正确的
- NFS允许不同主机上的进程同时访问,这里的问题是针对同一主机上的进程,因此NFS不应该造成差异李>
- 是的,他们当然可以,但要注意以下几点:
# create a 10m file
dd if=/dev/zero of=/var/tmp/file bs=1024k count=10
# create two 1 MB files
cd /tmp
printf "aaaaaaaa" > aa
printf "bbbbbbbb" > bb
i=0
while [ $i -lt 17 ]; do
cat aa aa > aa.new && mv aa.new aa
cat bb bb > bb.new && mv bb.new bb
i=$((i+1))
done
ls -lG /var/tmp/file /tmp/aa /tmp/bb
# launch 10 processes that will write at different locations in the same file.
# Uses dd notrunc option for the file not to be truncated
# Uses GNU dd fdatasync option for unbuffered writes
i=0
while [ $i -lt 5 ]; do
(
dd if=/tmp/aa of=/var/tmp/file conv=notrunc,fdatasync bs=1024k count=1 seek=$((i*2)) 2>/dev/null &
dd if=/tmp/bb of=/var/tmp/file conv=notrunc,fdatasync bs=1024k count=1 seek=$((i*2+1)) 2>/dev/null &
) &
i=$((i+1))
done
# Check concurrency
printf "\n%d processes are currently writing to /var/tmp/file\n" "$(fuser /var/tmp/file 2>/dev/null | wc -w)"
# Wait for write completion and check file contents
wait
printf "/var/tmp/file contains:\n"
od -c /var/tmp/file
其输出显示十个进程成功地同时写入同一个文件:
-rw-r--r-- 1 jlliagre 1048576 oct. 30 08:25 /tmp/aa
-rw-r--r-- 1 jlliagre 1048576 oct. 30 08:25 /tmp/bb
-rw-r--r-- 1 jlliagre 10485760 oct. 30 08:25 /var/tmp/file
10 processes are currently writing to /var/tmp/file
/var/tmp/file contains:
0000000 a a a a a a a a a a a a a a a a
*
4000000 b b b b b b b b b b b b b b b b
*
10000000 a a a a a a a a a a a a a a a a
*
14000000 b b b b b b b b b b b b b b b b
*
20000000 a a a a a a a a a a a a a a a a
*
24000000 b b b b b b b b b b b b b b b b
*
30000000 a a a a a a a a a a a a a a a a
*
34000000 b b b b b b b b b b b b b b b b
*
40000000 a a a a a a a a a a a a a a a a
*
44000000 b b b b b b b b b b b b b b b b
*
50000000
- 索引节点中没有记录文件偏移量,因此回答2。这是不正确的
- 没有文件证明流程修改其访问权限的原因so 3。这是不正确的
- NFS允许不同主机上的进程同时访问,这里的问题是针对同一主机上的进程,因此NFS不应该造成差异李>
# create a 10m file
dd if=/dev/zero of=/var/tmp/file bs=1024k count=10
# create two 1 MB files
cd /tmp
printf "aaaaaaaa" > aa
printf "bbbbbbbb" > bb
i=0
while [ $i -lt 17 ]; do
cat aa aa > aa.new && mv aa.new aa
cat bb bb > bb.new && mv bb.new bb
i=$((i+1))
done
ls -lG /var/tmp/file /tmp/aa /tmp/bb
# launch 10 processes that will write at different locations in the same file.
# Uses dd notrunc option for the file not to be truncated
# Uses GNU dd fdatasync option for unbuffered writes
i=0
while [ $i -lt 5 ]; do
(
dd if=/tmp/aa of=/var/tmp/file conv=notrunc,fdatasync bs=1024k count=1 seek=$((i*2)) 2>/dev/null &
dd if=/tmp/bb of=/var/tmp/file conv=notrunc,fdatasync bs=1024k count=1 seek=$((i*2+1)) 2>/dev/null &
) &
i=$((i+1))
done
# Check concurrency
printf "\n%d processes are currently writing to /var/tmp/file\n" "$(fuser /var/tmp/file 2>/dev/null | wc -w)"
# Wait for write completion and check file contents
wait
printf "/var/tmp/file contains:\n"
od -c /var/tmp/file
其输出显示十个进程成功地同时写入同一个文件:
-rw-r--r-- 1 jlliagre 1048576 oct. 30 08:25 /tmp/aa
-rw-r--r-- 1 jlliagre 1048576 oct. 30 08:25 /tmp/bb
-rw-r--r-- 1 jlliagre 10485760 oct. 30 08:25 /var/tmp/file
10 processes are currently writing to /var/tmp/file
/var/tmp/file contains:
0000000 a a a a a a a a a a a a a a a a
*
4000000 b b b b b b b b b b b b b b b b
*
10000000 a a a a a a a a a a a a a a a a
*
14000000 b b b b b b b b b b b b b b b b
*
20000000 a a a a a a a a a a a a a a a a
*
24000000 b b b b b b b b b b b b b b b b
*
30000000 a a a a a a a a a a a a a a a a
*
34000000 b b b b b b b b b b b b b b b b
*
40000000 a a a a a a a a a a a a a a a a
*
44000000 b b b b b b b b b b b b b b b b
*
50000000
定义: 是的,这两个进程将有自己的文件表条目 如果使用open函数打开文件两次,则会创建两个文件描述符 每个文件描述符都有单独的文件状态标志 因此,这两个文件描述符具有写入权限文件描述符1,文件描述符2具有指向文件的第一个字符的初始位置 若我们为描述符和写入文件指定了一些位置,那个么就可以很容易地对其进行测试 file.txt的内容 我叫钱德鲁。这是一个空文件 测试编码:
#include<stdio.h>
#include<fcntl.h>
#include<stdlib.h>
main()
{
int fd1, fd2;
if((fd1=open("file.txt", O_WRONLY)) <0){
perror("Error");
exit(0);
}
if((fd2=open("file.txt", O_WRONLY)) < 0) {
perror("Error");
exit(0);
}
if(lseek(fd1,20,SEEK_SET) != 20)
{
printf("Cannot seek\n");
exit(0);
}
if(write(fd1,"testing",7) != 7)
{
printf("Error write\n");
exit(0);
}
if(lseek(fd2,10,SEEK_SET) != 10)
{
printf("Cannot seek\n");
exit(0);
}
if(write(fd2,"condition",9) != 9)
{
printf("Error write\n");
exit(0);
}
}
#包括
#包括
#包括
main()
{
int-fd1,fd2;
如果((fd1=open(“file.txt”,O_WRONLY))定义:
是的,这两个进程将有自己的文件表条目
如果使用open函数打开文件两次,则会创建两个文件描述符
每个文件描述符都有单独的文件状态标志
因此,这两个文件描述符具有写入权限文件描述符1,文件描述符2具有指向文件的第一个字符的初始位置
若我们为描述符和写入文件指定了一些位置,那个么就可以很容易地对其进行测试
file.txt的内容
我叫钱德鲁,这是一个空文件
测试编码:
#include<stdio.h>
#include<fcntl.h>
#include<stdlib.h>
main()
{
int fd1, fd2;
if((fd1=open("file.txt", O_WRONLY)) <0){
perror("Error");
exit(0);
}
if((fd2=open("file.txt", O_WRONLY)) < 0) {
perror("Error");
exit(0);
}
if(lseek(fd1,20,SEEK_SET) != 20)
{
printf("Cannot seek\n");
exit(0);
}
if(write(fd1,"testing",7) != 7)
{
printf("Error write\n");
exit(0);
}
if(lseek(fd2,10,SEEK_SET) != 10)
{
printf("Cannot seek\n");
exit(0);
}
if(write(fd2,"condition",9) != 9)
{
printf("Error write\n");
exit(0);
}
}
#包括
#包括
#包括
main()
{
int-fd1,fd2;
如果((fd1=open(“file.txt”,仅限O_))这是一个家庭作业/测试问题,不是吗?@PaulProgrammer yes tbh。这是一个提示,其中三个回答不正确。@jlliagre你为什么不去做其他事情呢?如果你在这个问题上已经失败了两次,你应该只有两个选择,不是吗?这是一个家庭作业/测试问题,不是吗?@PaulProgrammer yes tbh。这是一个提示,t有三个回答不正确。@jlliagre你为什么不去做些别的事情呢?如果你在这个问题上已经失败了两次,你应该只有两个剩余的选择,不是吗?当你显示同一个文件的多个文件描述符可以同时存在时,这确实是主要问题,你并没有真正回答关于t的问题两个不同的进程写入同一个文件,而不是单个进程。虽然您展示了同一文件的多个文件描述符可以同时存在,这确实是要点,但您并没有真正回答关于两个不同进程写入同一文件而不是单个进程的问题。