我正在看Maurice Bach的Unix Book中的一个例子。他写了一个简单的复制程序,如下所述。但是,当输入文件是目录文件时,它会失败。我确实偶然发现了opendir
和其他一些这样的API -我应该使用它吗?
如果二进制文件可以这样工作,为什么目录文件被认为是不同的?在Unix中,不是所有的东西都抽象为一个文件,而不管程序如何解释它。
我怎么能扩展这个程序,以支持目录文件,然后创建一个mknod ?我想测试一下,假设我在/home/user1
中,做一个$./copy /home/user user-home-clone
和mknod
,看看这个目录和家里的有什么不同。我猜user-home-clone
可能没有对自己的引用,但/home/user
中的所有其他文件[即使它将一个名为user-home-clone的文件放在/home/user中],因为当我们执行复制命令时它不在那里?
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
char buffer[2048];
int copy(FILE *source, FILE *destination)
{
int count;
while ((count = fread(buffer, 1, sizeof buffer , source)) > 0)
{
fwrite(buffer, 1, count, destination);
}
return 0;
}
int main(int argc, char* argv[])
{
int status;
FILE *source;
FILE *destination;
if (argc != 3)
{
printf("%s takes exactly 3 argumentsn", argv[0]);
exit(1);
}
source = fopen(argv[1], "r");
if (source == NULL)
{
printf("%s can't be opened for readingn", argv[1]);
exit(1);
}
destination = fopen(argv[2], "wb");
if (destination == NULL)
{
printf("%s can't be opened for writingn", argv[2]);
exit(1);
}
if (copy(source, destination) == 0)
{
status = 0;
}
else
{
status = 1;
}
fclose(source);
fclose(destination);
exit(status);
}
我使用Centos 6.5 Linux Ext4 Filesystem
在Unix的早期版本中,目录文件可以作为二进制文件读取。但是,当添加网络和其他类型的虚拟文件系统时,这种功能就被删除了,因为不同的文件系统实现目录的方式不同。虽然驱动程序在技术上可以模拟这些目录的字节流结构,但它并不被视为一个有用的特性。目录应被视为不透明的抽象集合,并使用特定于目录的函数进行访问。