我一直在阅读Brian Kernighan和Dennis Ritchie - C编程语言,第8.6章是关于UNIX OS下的目录列表。他们说一切甚至目录都是一个文件。这意味着我应该能够将目录作为文件打开?我已经尝试使用stdio函数,但它没有用。现在,我正在尝试使用UNIX系统功能。当然,我没有使用UNIX,我正在使用Ubuntu linux。这是我的代码:
#include <syscall.h>
#include <fcntl.h>
int main(int argn, char* argv[]) {
int fd;
if (argn!=1) fd=open(argv[1],O_RDONLY,0);
else fd=open(".",O_RDONLY,0);
if (fd==-1) return -1;
char buf[1024];
int n;
while ((n=read(fd,buf,1024))>0)
write(1,buf,n);
close (fd);
return 0;
}
即使当argn为1(无参数)并且我正在尝试读取当前目录时,也不会写入任何内容。 有什么想法/解释吗? :)
答案 0 :(得分:3)
Nachiket的答案是正确的(确实是sujin),但他们并没有澄清为什么open
有效而不是read
的谜团。出于好奇,我对给定的代码做了一些修改,以确切了解发生了什么。
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
int main(int argc, char* argv[]) {
int fd = -1;
if (argc!=1) fd=open(argv[1],O_RDONLY,0);
else fd=open(".",O_RDONLY,0);
if (fd < 0){
perror("file open");
printf("error on open = %d", errno);
return -1;
}
printf("file descriptor is %d\n", fd);
char buf[1024];
int n;
if ((n=read(fd,buf,1024))>0){
write(1,buf,n);
}
else {
printf("n = %d\n", n);
if (n < 0) {
printf("read failure %d\n", errno);
perror("cannot read");
}
}
close (fd);
return 0;
}
编译并运行此结果:
file descriptor is 3
n = -1
read failure 21
cannot read: Is a directory
虽然我已经预期open
会失败,但由于打开目录的正确系统函数为opendir()
,所以会解决它。
答案 1 :(得分:2)
文件也称为regular files
,以区别于special files
。
目录或不是regular file
。最常见的special file
是目录。目录文件的布局由使用的文件系统定义。
因此请使用opendir打开diretory。
答案 2 :(得分:2)
虽然unix中的所有内容都是文件(目录也是如此),但仍然是文件类型,概念存在于unix中并适用于所有文件。 有常规文件,目录等文件类型,每种文件类型都允许/存在某些操作和功能。
在您的情况下,readdir适用于读取目录的内容。
答案 3 :(得分:1)
答案 4 :(得分:0)
K&amp; R对于原始UNIX是正确的。我记得当UNIX文件系统的文件名长度限制为14个字符时,我会回复它。 opendir(),readdir(),...的事情发生在较长的文件名变得普遍的时候(1990年左右?)