2011-04-02 53 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