我试图从Linux中的文件夹中读取所有文件和目录,其线程为 获取最大文件大小&当前目录和当前目录树下的名称。在线程应用程序(linux,pthreads)中读取文件大小时出错

主线程扫描基本目录查找文件,当找到它的目录时,会生成一个新线程以生成继续扫描的线程。

在这一点上,线程加入,直到最后创建的线程结束。 (我知道这不是最好的方法,但它只是一个练习。)

问题是,它的程序返回错误的结果,我不知道为什么。

我有以下文件树来测试应用程序:下树

. (Debug folder under codelite project/workspace)

├── [ 4096] dir1

│ └── [ 9] arch-dir1.txt

├── [ 4096] dir2

│ ├── [ 27] arch-dir2.txt

│ └── [ 29083] huge

├── [ 29053] direxp

├── [ 27048] direxp.o

└── [ 68] direxp.o.d

正如你可以看到当前目录下的最大文件大小是direxp(这个节目),最大文件大小是巨大的

运行二进制文件,我得到了以下结果:

dir: .

dir: ..

arch: direxp.o.d

max dir & tree set to: direxp.o.d size: 68

arch: direxp.o

max file dir set to: direxp.o size: 27048

arch: .d

arch: direxp

max file dir set to: direxp size: 29053

dir: dir1

th dir: .

th dir: ..

th arch: arch-dir1.txt thsize: 4096

max tree file set to: arch-dir1.txt thsize: 4096

dir: dir2

th dir: .

th dir: ..

th arch: arch-dir2.txt thsize: 4096

th arch: huge thsize: 4096

Highest current directory file:

direxp tam:29053 bytes.

Highest tree file:

arch-dir1.txt tam:4096 bytes.

个前缀字符串显示在另一个线程处理的数据。

我使用函数readdir(主线程)和readdir_r(衍生线程)来读取目录条目。

我认为这可能是麻烦,但后来编译程序调用readdir_r在所有线程下,并且错误的结果仍然存在。

我真的不明白,为什么文件大小它返回错误的(4096它在我的文件系统默认的簇大小。那么,为什么文件处理为目录?

能给我一个忙吗? 感谢

主要功能码

#include

#include

#include

#include

#include

#include

#include

#include

#include

using std::cout;

using std::cin;

using std::endl;

#define MAX_PATH 255

struct archivo

{

char nombre[MAX_PATH+1];

off_t tam;

};

// thread args

struct thargs

{

char nextdir[MAX_PATH+1]; // next dir

void* (*pth)(void*); // pointer to thread function

archivo* arch; // pointer to archivo

};

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

int main(int argc, char **argv)

{

char target[MAX_PATH+1] = {0}; // directorio inicial

archivo grande_dir ={{0}},grande_arbol = {{0}};

// No params

if (argc < 2)

{

if (! getcwd(target,MAX_PATH))

{

perror("Error en path:");

exit(-1);

}

}

if (argc == 2)

strncpy(target,argv[1],MAX_PATH);

if (argc > 2)

{

perror("Num params incorrecto");

exit(-2);

}

DIR* midir = NULL;

// try to open target dir

if (! (midir = opendir(target)))

{

perror("Error abriendo dir:");

exit(-3);

}

dirent* direntry;

//dirent* rentry1 = NULL;

struct stat estado = {0}; // struct needed for desambiguation

bool primera = true; // control var to initialize the search

// read current dir contents

//while((readdir_r(midir,&direntry,&rentry1) == 0) && rentry1 )

while((direntry = readdir(midir)))

{

stat(direntry->d_name,&estado);

// current entry it's a file

if (direntry->d_type == DT_REG)

{

cout << "arch: " << direntry->d_name << endl;

// init search to find the highest file

if (primera)

{

strncpy(grande_dir.nombre,direntry->d_name,MAX_PATH);

grande_dir.tam = estado.st_size;

strncpy(grande_arbol.nombre,direntry->d_name,MAX_PATH);

grande_arbol.tam = estado.st_size;

primera = false;

cout << "max dir & tree set to: " << direntry->d_name << " size: " << estado.st_size << endl;

}

// High file size

if (estado.st_size > grande_dir.tam)

{

pthread_mutex_lock(&lock);

strncpy(grande_dir.nombre,direntry->d_name,MAX_PATH);

grande_dir.tam = estado.st_size;

pthread_mutex_unlock(&lock);

cout << "max file dir set to: " << direntry->d_name << " size: " << estado.st_size << endl;

}

}

// current entry it's a directory

if (direntry->d_type == DT_DIR)

{

cout << "dir: " << direntry->d_name << endl;

// check not . or .. dir

if ((strcmp(direntry->d_name,".") != 0) && (strcmp(direntry->d_name,"..") != 0))

{

thargs args = {{0}};

pthread_t th1;

pthread_mutex_lock(&lock);

sprintf(args.nextdir,"%s/%s",target,direntry->d_name);

args.arch = &grande_arbol;

args.pth = &procesadir;

pthread_mutex_unlock(&lock);

// new thread creation

pthread_create(&th1,NULL,procesadir,&args);

// main thread waits th1 completion

pthread_join(th1, NULL);

}

}

}

closedir(midir);

pthread_mutex_destroy(&lock);

cout << endl << "Highest file in current directory file :" << endl

<< grande_dir.nombre << " tam:" << grande_dir.tam

<< " bytes." << endl;

cout << endl << "Highest file in tree:" << endl

<< grande_arbol.nombre << " tam:" << grande_arbol.tam

<< " bytes." << endl;

return 0;

}

线程函数代码

void* procesadir(void* args)

{

thargs* myargs = reinterpret_cast(args);

DIR* thdir = NULL;

if ((thdir = opendir(myargs->nextdir)))

{

dirent thentry;

dirent* rentry = NULL;

struct stat thstat = {0};

//while((thentry = readdir(thdir)))

while((readdir_r(thdir,&thentry,&rentry) == 0) && rentry )

{

stat(thentry.d_name,&thstat);

if (thentry.d_type == DT_REG)

{

cout << " th arch: " << thentry.d_name << " thsize: " << thstat.st_size << endl;

if (thstat.st_size > myargs->arch->tam)

{

pthread_mutex_lock(&lock);

memset(myargs->arch->nombre,0,MAX_PATH);

strncpy(myargs->arch->nombre,thentry.d_name,MAX_PATH);

myargs->arch->tam = thstat.st_size;

pthread_mutex_unlock(&lock);

cout << "max tree file set to: " << thentry.d_name << " thsize: " << thstat.st_size << endl;

}

}

if (thentry.d_type == DT_DIR)

{

if ((strcmp(thentry.d_name,".") != 0) && (strcmp(thentry.d_name,"..") != 0))

{

thargs largs = {{0}};

pthread_t th2;

sprintf(largs.nextdir,"%s/%s",myargs->nextdir,thentry.d_name);

largs.arch = myargs->arch;

largs.pth = myargs->pth;

// thread creation

pthread_create(&th2,NULL,procesadir,&args);

// current thread waits th2 completion

pthread_join(th2, NULL);

}

cout << " th dir: " << thentry.d_name << endl;

}

}

closedir(thdir);

else

perror("Error abriendo dir en thread:");

return 0;

}

2012-01-26

ppk

linux线程出错,在线程应用程序(linux,pthreads)中读取文件大小时出错相关推荐

  1. 在python中读取文件时如何去除行末的换行符以及在Windows与Linux中的区别

    [时间]2018.11.14 [题目]在python中读取文件时如何去除行末的换行符以及在Windows与Linux中的区别 一.去除换行符 以使用readline进行读取为例: import red ...

  2. 详细信息:“从提供程序读取数据时出错:“Could not load file or assembly 'Renci.SshNet, Version=2016.1.0.0, Culture=neutr

    BI从MYSQL导入数据 提示: 详细信息:"从提供程序读取数据时出错:"Could not load file or assembly 'Renci.SshNet, Versio ...

  3. mysql union 出错_ORDER BY子句在MySQL中使用UNION时出错(Error with ORDER BY clause using UNION in MySQL)...

    ORDER BY子句在MySQL中使用UNION时出错(Error with ORDER BY clause using UNION in MySQL) 我在MySQL中有以下查询: (SELECT ...

  4. column ambiguously defined oracle数据库分页语句查询中select嵌套时出错

    column ambiguously defined &oracle数据库分页语句查询中select嵌套时出错 转载于 [ lev草梦的博客](http://blog.sina.com.cn/ ...

  5. linux系统在硬盘上安装程序,在硬盘中安装Linux操作系统最简单的方法

    通过Grub(多系统引导管理器)来安装 本人最近摸索Linux系统,想在本机上安装双系统,但我这老爷机上没有软驱,没有刻录机,下载的ISO文件只能存在硬盘上,也只能通过硬盘来安装,在各大Linux的B ...

  6. Linux——权限|shell运行原理——外壳程序|Linux权限的概念|对人操作|角色和文件操作|文件类型访问权限|修改权限ugo+-|8进制|修改权限|更改文件的拥有

    目录 shell运行原理--外壳程序 Linux权限的概念 对人操作 角色和文件操作 文件类型

  7. linux编写多时区时间显示程序,Linux系统时区时间修改

    我们知道,计算机系统有两个时钟,一个是硬件时钟,一个是系统时钟,硬件时钟的工作原理就是电脑在开机运行的时候会给主板上的纽扣电池充电,关机后这块电池还为存放系统参数的CMOS.RAM供电,以保存其中的系 ...

  8. 安装程序遇到错误:0x80240037 尝试打开时出错 - WSUSSCAN.cab 错误: 0x80070002。WSUSSCAN.cab文件 是什么?cab 是什么文件?

    安装程序遇到错误:0x80240037 Windows安装程序遇到错误:0x80240037 尝试打开时出错 - WSUSSCAN.cab 错误: 0x80070002 WSUSSCAN.cab是什么 ...

  9. SpringBoot启动项目时提示:Error:java: 读取***.jar时出错;

    场景 在IDEA中新建SpringBoot项目后,修改了默认的Maven仓库和配置文件,然后在启动项目时提示: Error:java: 读取\org\assertj\assertj-core\3.11 ...

最新文章

  1. spark Intellij IDEA及eclipse开发环境搭建
  2. 我为什么看好中国的共享单车
  3. Git——跟踪或取消跟踪文件
  4. Direct3D 开发之旅 3D 游戏基本概念的介绍2
  5. [html] 如何在不同的端口间共享cookie?
  6. linux 线程_Linux 多线程编程(不限Linux)
  7. linux signal 符号表6,gdb调试信息__000_linux-gnu_00000000_002_rw-p__169IT.COM
  8. C++工作笔记-map中结构体的比较
  9. 使用jstack查看某个Java进程内的线程堆栈信息
  10. java已知 求p_Java 0520 第五次课作业
  11. 广科计算机专业3 2分数线,考试网:重庆最新高考录取分数线发布 理科一本533分...
  12. Druid monitor中数据源只显示() property for user to setup(已解决)
  13. 怎么制作真人qq秀_NBA赛事最震撼的开场秀
  14. HTML5生日快乐代码 (烟花蛋糕+3D相册) HTML+CSS+JavaScript
  15. Linux中shell脚本详解
  16. Python 爬虫超详细讲解(零基础入门,老年人都看的懂)
  17. JavaScript 获取元素方法
  18. 简单的科普(引导模式、分区格式)
  19. 计算机公务员写材料吗,公务员写材料到底从哪入手啊
  20. Ubuntu安装谷歌拼音输入法/搜狗拼音输入法

热门文章

  1. Python - 排序( 插入, 冒泡, 快速, 二分 )
  2. hdu 6301 Distinct Values(贪心)题解
  3. mysql本地连接错误解决办法
  4. 码农和程序员的几个重要区别!
  5. HTTP状态码:400\500 错误代码
  6. kickStart脚本
  7. 352. 将数据流变为多个不相交区间
  8. 程序员如何学习更好的知识_如何保持学习并成为更好的程序员
  9. 未来编程语言的走向_在编程方面我从失败走向成功的过程以及让我成功的原因
  10. 【0718作业】收集和整理面向对象的六大设计原则