Open()系统调用与DIR目录指针结合使用不起作用

时间:2016-11-13 19:02:37

标签: c linux system-calls

Open()系统调用在此代码中不起作用。但是,如果不与目录指针组合使用,它们将正常工作。这里我使用file-> d_name来访问字符串基地址以打开文件,但它不起作用并打印错误。

#include<stdio.h>
#include<string.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<dirent.h> 
#include<unistd.h>
#include<sys/dir.h>

int main()
{
  DIR* d=opendir("DDD");
  struct dirent* file;
  int fd;
  char WBUFFER[]="IO OS system calls\n";
  char RBUFFER[100001];

  while((file=readdir(d))!=NULL)
  if(strlen(file->d_name)>=10)
    {
      if((fd=open(file->d_name,O_RDWR,0))==-1)
        printf("error\n");
      read(fd,RBUFFER,101);
      printf("%s",RBUFFER);
      close(fd);   
    }
  else if(strlen(file->d_name)>=3)
    { 
      if((fd=open(file->d_name,O_RDWR,0))==-1)
      printf("error2\n");
      write(fd,WBUFFER,50);
      close(fd);
    }

}

2 个答案:

答案 0 :(得分:1)

file->d_name仅包含文件名,而不包含open(2)所需的相对或绝对路径。这就是open()失败的原因(除非您的当前目录中的文件与目录DDD的名称相同)。

您需要使用file->d_name将目录名称添加到snprintf(),例如:

char buf[PATH_MAX];
snprintf(buf, sizeof buf, "DDD/%s", file->d_name);

并在buf来电中使用open()

答案 1 :(得分:1)

所以dirent-&gt; d_name只包含文件名,而不包含路径。如果您正在使用现代Linux或POSIX-2008兼容系统,那么做一些你正在做的事情的方式就好了(缩短半伪代码,填写细节留给读者练习:)


int dfd = open("DDD", ...);
DIR *d = fdopendir(dfd);
...
while ((file = readdir(d)) != NULL) {
    int fd = openat(dfd, file->d_name, ...);
    ...
}