这是我的代码
fd=open("a",O_RDWR | O_CREAT);
printf("%d\n", fd);
if(fd < 0)
{
perror("error");
exit(1);
}
lseek(fd, 0, SEEK_SET);
read(fd, buf, 10);
write(STDOUT_FILENO, buf, 10);
getchar();//1
lseek(fd, 0, SEEK_SET);
write(fd, "xxxxxxxxxx", 10);
getchar();//2
lseek(fd, 0, SEEK_SET);
read(fd, buf, 10);
write(STDOUT_FILENO, buf, 10);
getchar();//3
接下来是关于文件的内容
//file a, mode 600
//aaaaaaaaaaa
在第2步时,文件a的文本将更改为&#34; xxxxx ...&#34;。
然后我使用vim将文本更改为&#34; bbbbbbb ...&#34;在另一个终端。
第3步的输出为&#34; xxxxx ...&#34;
然而,当文件a
时//file a, mode 606 or 660
//aaaaaaaaaaaa
做同样的事情
输出为&#34; bbbbbbb ....&#34;
我的系统是os x 10.9
答案 0 :(得分:1)
我可以重现这个问题,令我非常惊讶(Mac OS X 10.9.4)。
但是,正如我在评论中暗示的可能性,问题似乎是vim
正在更改文件的inode编号,当文件具有600权限时:
$ for mode in 600 606 660 666
> do
> echo "Mode: $mode"
> echo "abcdefghijklmnopqrst" > a
> chmod $mode a
> ls -li a
> vim a
> cat a
> ls -li a
> done
Mode: 600
25542402 -rw------- 1 jleffler staff 21 Sep 2 07:58 a
xxxxxxxxxxklmnopqrst
25542484 -rw------- 1 jleffler staff 21 Sep 2 07:58 a
Mode: 606
25542484 -rw----rw- 1 jleffler staff 21 Sep 2 07:58 a
xxxxxxxxxxklmnopqrst
25542484 -rw----rw- 1 jleffler staff 21 Sep 2 07:58 a
Mode: 660
25542484 -rw-rw---- 1 jleffler staff 21 Sep 2 07:58 a
xxxxxxxxxxklmnopqrst
25542484 -rw-rw---- 1 jleffler staff 21 Sep 2 07:58 a
Mode: 666
25542484 -rw-rw-rw- 1 jleffler staff 21 Sep 2 07:58 a
xxxxxxxxxxklmnopqrst
25542484 -rw-rw-rw- 1 jleffler staff 21 Sep 2 07:58 a
$
在每种情况下,我都在10rx
中运行了:x
和vim
命令。
我不清楚为什么vim
需要在文件获得600权限时更改inode,但是它确实存在我坐在哪里的错误。这是我根本没想到的行为(除了它解释了你所看到的)。
因为&#39;文件描述符&#39;程序(问题中的大纲代码)保持相同的文件打开,它正在使用的文件的inode编号不会改变,但因为vim
用新的inode编号重写文件(意思是:它创建一个具有新名称和包含修改内容的inode编号的新文件,然后删除旧版本的a
并将其替换为新文件),由vim
进行编辑(当文件具有{{时)在程序打开的文件中看不到1}}}}权限)。在文件描述符的末尾&#39;当权限为600
时,程序打开的文件没有名称,系统删除其内容; 600
创建的文件取代了原始文件。