1

ディレクトリを引数として受け取り、そのディレクトリ内の各ファイルとそのサブディレクトリごとに、monfileというプログラムを呼び出すLinux用のプログラムを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エラーメッセージとその後のフォークエラーメッセージでした。これは私に 2 つの質問をもたらしました: a) cicle はどのように何度も繰り返しましたか? b) monfile がどのように構築され、mondir と同じフォルダーにあるのかを確認すると、exec のどこが間違っていたのでしょうか?

そこで、追加することで、プログラムが見ているディレクトリを把握することにしました

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

cicle の冒頭で、次のように呼び出されたにもかかわらず、どういうわけかすべてのディレクトリをスキャンしていました: mondir Subfolder1 ...(other args)、mondir と同じディレクトリ内の Subfolder1 です。ディレクトリの問題と実行の問題の両方で、ここで何が間違っていますか?

4

3 に答える 3

1

readdir は「.」を返します。および「..」なので、コードはディレクトリツリーを上っていき、すべてのディレクトリを永遠に繰り返します-fork/execがマシンを爆撃します。

また、前述のfind -execように、合理的な代替案と思われますか?

于 2011-04-02T21:28:13.370 に答える
1

あなたのコードはサブディレクトリをうまく処理していません。closedir()現在のディレクトリの処理を停止し (ただし、新しいディレクトリで上書きする前に古いディレクトリを処理しないため、処理中に DIR ポインタがリークします) chdir()、新しいディレクトリに移動します。

.また、ディレクトリ エントリと..;も避けません。おそらくそれらを処理したくないでしょうがreaddir()、各ディレクトリの最初の 2 つのエントリとしてそれらを忠実に返します。これがプロセスのフラッドの原因です。

POSIX 関数を検索してnftw()使用する必要があります。または、コードが機能するまでディレクトリの処理を試みないでください。

于 2011-04-02T21:28:26.813 に答える
0

あなたは非常によくある間違いにreaddir()つまずいています.

于 2011-04-02T21:18:17.390 に答える