我正在爲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問題?
您正在編寫此程序而不是使用'find -exec'的任何特定原因? – 2011-04-02 21:21:21
學術原因。 – 2011-04-02 21:30:29
這裏有很多錯誤,其中之一是'chdir(dentry-> d_name); dir = opendir(dentry-> d_name);'...這些順序錯誤,或者後者應該是'opendir(「。」)''。 – 2011-04-03 03:46:42