2011-04-02 73 views
1

我正在为Linux中的C程序接收一个目录作为参数,然后对于该目录中的每个文件以及它的每个子目录,调用一个名为monfile的程序。下面的代码:C中的目录问题

#include <stdio.h> 
#include <dirent.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <signal.h> 
#include <stdlib.h> 
#include <fcntl.h> 

#define DIR_ARG 1 
#define DUR_ARG 2 
#define SEC_ARG 3 
#define LOG_ARG 4 
#define OP1_ARG 5 
#define OP2_ARG 6 

int main(int argc, char** argv) 
{ 
    // Teste aos argumentos 
    if (argc < 5) { 
     printf("Erro! Argumentos insuficientes!\n"); 
     return -1; 
    } 

    // Declaração de variáveis 
    DIR *dir; 
    struct dirent *dentry; 
    struct stat stat_entry; 

    int fork_result; 


    // Testa se o directório passado como argumento é válido 
    if ((dir = opendir(argv[DIR_ARG])) == NULL) 
    { 
     perror(argv[DIR_ARG]); 
     exit(2); 
    } 

    chdir(argv[DIR_ARG]); 
    // Ciclo de propagação 
    while ((dentry = readdir(dir)) != NULL) { 

     stat(dentry->d_name, &stat_entry); 
     // Se for ficheiro regular 
     if (S_ISREG(stat_entry.st_mode)) { 
      fork_result = fork(); 
      if (fork_result == -1) { 
       printf("file fork error!\n"); 
       exit(1); 
      } 
      if (fork_result == 0) { 
       execlp("monfile", "monfile", argv[SEC_ARG], dentry->d_name, filedes, (char *)NULL); 
       printf("Erro no exec!\n"); 
       exit(1); 
      } 
     } 
     // Se for directório vai criar um novo processo e passar dir para esse directório 
     if (S_ISDIR (stat_entry.st_mode)) { 
      fork_result = fork(); 
      if (fork_result == -1) { 
       printf ("dir fork error!\n"); 
       exit(1); 
      } 
      if (fork_result == 0) { 
       chdir(dentry->d_name); 
       dir = opendir (dentry->d_name); 
      } 
     } 
    } 



    return 0; 
} 

现在,这样做的结果是......一吨EXEC错误信息,然后一堆叉的错误消息,即使我只是调用这个与文件的目录,一个子目录。这给我带来了两个问题: a)cicle如何进行如此多的迭代? b)exec有什么问题,看看monfile是如何构建的,并且与mondir位于同一文件夹中?

所以,我决定通过在cicle的beggining加入

printf("%s\n", dentry->d_name); 

找出目录下的程序看,它在某种程度上扫描每一个目录,即使它被称为像这样: mondir Subfolder1 ...(其他参数),作为与mondir相同的目录中的Subfolder1。我在这里做错了什么,包括目录问题和exec问题?

+1

您正在编写此程序而不是使用'find -exec'的任何特定原因? – 2011-04-02 21:21:21

+0

学术原因。 – 2011-04-02 21:30:29

+0

这里有很多错误,其中之一是'chdir(dentry-> d_name); dir = opendir(dentry-> d_name);'...这些顺序错误,或者后者应该是'opendir(“。”)''。 – 2011-04-03 03:46:42

回答

0

你绊倒一个非常常见的错误:由readdir()返回的名称不具有源目录名称前缀,所以你必须把它放在那里自己。

+0

这不是这里的问题。 – 2011-04-02 21:29:31

1

READDIR将返回 “”和“..”,所以你的代码将遍历目录树,以及永远重复每个目录 - fork/exec轰炸你的机器。

此外,如前所述,find -exec似乎一个合理的选择?

+0

谢谢,这确实是“。” “......”shennanigans。没有找到-exec,正如我在评论中提到的那样,这是一个大学项目。 – 2011-04-02 21:32:20

1

您的代码不处理子目录非常好。您停止处理当前目录(但在此过程中泄漏DIR指针,因为您在旧文件夹之前不执行closedir()),然后chdir()进入新目录。

你也不要回避目录条目...;你可能不想处理它们,但readdir()会忠实地将它们作为每个目录中的前两个条目返回。这说明了流程的泛滥。

你应该看看了POSIX功能nftw()和使用 - 或不尝试处理目录,直到后​​您的代码工作。

+0

谢谢,。和..确实是问题,并感谢提醒我关于closedir! – 2011-04-02 21:31:17