2

について質問がありfts(3)ます。関数のメンバーにアクセスしようとすると、セグメンテーション違反が発生しfts_children()ます。http://www.kernel.org/doc/man-pages/online/pages/man3/fts.3.htmlのmanページを読むと、read関数が実行された後に自分自身がいっぱいになると主張し、リンクされたリンクリストを返します。link構造内のフィールドを介して。私の疑いは、child_functionが何も返さないということですが、それがmanページと一致していないように感じます。自動的に行われていると思ったので、これらのファイルを子バッファーに追加することになっていますか?私のコードは下にあります、ありがとう!

#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fts.h>
#include<string.h>

int compare (const FTSENT**, const FTSENT**);

int main(int argc, char* const argv[])
{

        FTS* file_system = NULL;
        FTSENT* child = NULL;
        FTSENT* parent = NULL;
        FTSENT* temp = NULL;

        file_system = fts_open(argv + 1,FTS_COMFOLLOW | FTS_NOCHDIR,&compare);

        while( (parent = fts_read(file_system)) != NULL)
        {

             child = fts_children(file_system,0);
             printf("%s\n", child->fts_path);


        }
//      while (child ->fts_link != NULL)
      //         child = child->fts_link;
        fts_close(file_system);
        return 0;
}

int compare(const FTSENT** one, const FTSENT** two){
        return (strcmp((*one)->fts_name, (*two)->fts_name));
}
"test_fs.c" 43L, 1108C  
4

2 に答える 2

3

NULL チェックを追加するだけです。

あなたはしたいかもしれない

  • のために1つ追加file_system
  • コマンドライン引数をチェック
  • エラー処理を追加します。

    この関数は、成功した場合、ディレクトリ内の終了したファイルのリンク リストの最初のエントリを記述する構造体fts_children()へのポインタを返します。関数は失敗し、、、、、、および関数が指定するエラーのいずれかが設定される場合があります。FTSENTNULLfts_children()errnochdir()malloc()opendir()readdir()stat()

コメントの新しい質問に更新します。

  • リンクされたリスト トラバーサルの while ループが間違って配置されていました (外側のループの外?)
  • printf は、ファイル名ではなく、パスのみを表示しました。

あなたがそれにいる間:

#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fts.h>
#include<string.h>
#include<errno.h>

int compare (const FTSENT**, const FTSENT**);

int main(int argc, char* const argv[])
{
    FTS* file_system = NULL;
    FTSENT* child = NULL;
    FTSENT* parent = NULL;

    if (argc<2)
    {
        printf("Usage: %s <path-spec>\n", argv[0]);
        exit(255);
    }

    file_system = fts_open(argv + 1,FTS_COMFOLLOW | FTS_NOCHDIR,&compare);

    if (NULL != file_system)
    {
        while( (parent = fts_read(file_system)) != NULL)
        {
            child = fts_children(file_system,0);

            if (errno != 0)
            {
                perror("fts_children");
            }

            while ((NULL != child)
                && (NULL != child->fts_link))
            {
                child = child->fts_link;
                printf("%s%s\n", child->fts_path, child->fts_name);
            }
        }
        fts_close(file_system);
    }
    return 0;
}

int compare(const FTSENT** one, const FTSENT** two)
{
    return (strcmp((*one)->fts_name, (*two)->fts_name));
}

サンプル出力フラグメント:

./.profiles/sehe/.opera/icons/cache/g_0000
./.profiles/sehe/.opera/icons/cache/g_0000/opr00002.tmp
./.profiles/sehe/.opera/icons/cache/g_0000/opr00003.tmp
./.profiles/sehe/home/sehe/.mozilla
fts_children: Permission denied
./.vbox-sehe-ipc/lock
于 2012-09-26T20:51:23.983 に答える