Linux / Open目录作为文件

时间:2014-01-28 11:57:37

标签: c linux unix filesystems gnu

我一直在阅读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(无参数)并且我正在尝试读取当前目录时,也不会写入任何内容。 有什么想法/解释吗? :)

5 个答案:

答案 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)

如果您想查看目录中的文件,则必须使用opendirreaddir函数。

答案 4 :(得分:0)

K&amp; R对于原始UNIX是正确的。我记得当UNIX文件系统的文件名长度限制为14个字符时,我会回复它。 opendir(),readdir(),...的事情发生在较长的文件名变得普遍的时候(1990年左右?)