在同一用户在不同进程中读取和写入文件时文件模式的影响

时间:2014-09-02 12:56:16

标签: c unix process

这是我的代码

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

1 个答案:

答案 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中运行了:xvim命令。

我不清楚为什么vim需要在文件获得600权限时更改inode,但是它确实存在我坐在哪里的错误。这是我根本没想到的行为(除了它解释了你所看到的)。

因为&#39;文件描述符&#39;程序(问题中的大纲代码)保持相同的文件打开,它正在使用的文件的inode编号不会改变,但因为vim用新的inode编号重写文件(意思是:它创建一个具有新名称和包含修改内容的inode编号的新文件,然后删除旧版本的a并将其替换为新文件),由vim进行编辑(当文件具有{{时)在程序打开的文件中看不到1}}}}权限)。在文件描述符的末尾&#39;当权限为600时,程序打开的文件没有名称,系统删除其内容; 600创建的文件取代了原始文件。