Linux下C语言实现多线程排序文件内容
一、要求及主要函数
- 使用多线程,编写一个并行程序,将目录中的多个文件里的内容进行排序。
- 文件内容格式为: <数字><空格><数字> 例如: 0 1 2 3 4 5 6 7 8
- 定义全局变量存储给定目录下的多个(现假设有10个)文件的地址
- 文件名从0到9,当前有两个线程, 0号线程排序0 2 4 6 8号文件, 1号线程排序1 3 5 7 9号文件
pthread_create
功能
pthread_create是UNIX环境创建线程函数
函数原型
int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict_attr,void*(*start_rtn)(void*),void *restrict arg);
第一个参数为指向线程标识符的指针。
第二个参数用来设置线程属性。
第三个参数是线程运行函数的地址。
最后一个参数是运行函数的参数。
返回值
若成功则返回0,否则返回出错编号
pthread_join
功能
函数pthread_join用来等待一个线程的结束。
函数原型
extern int pthread_join __P (pthread_t __th, void **__thread_return);
第一个参数为被等待的线程标识符
第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。
注意
这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。如果执行成功,将返回0,如果失败则返回一个错误号。
这两函数的头文件为 #include<pthread.h>,在编译时需加上-lpthread参数,以调用静态链接库。因为pthread并非Linux系统的默认库。
二、主要代码
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
static pthread_t id1,id2;
static char filePathList[10][100];//存放文件路径
//qsort比较器
int cmp(const void *a, const void *b) {return (*(int *)a - *(int *)b);
}
//线程1,排序0、2、4、6、8
void funOne(int thread_num) {printf("Thread: %d running...\n",thread_num);//先读取文件里内容后排序,最后覆盖写入FILE *fp;int index=0;//开始的文件下标while(index<10) {fp=fopen(filePathList[index],"r");//只读int t[1024];//存放读取的文件内容int i=0,j;printf("Thread %d 读取%d文件内容:\n",thread_num,index);while(fscanf(fp,"%d",&t[i])>0) {// 读取数字printf("%d ",t[i]);i++;}printf("\n");fclose(fp);qsort(t,i,sizeof(t[0]),cmp);//排序文件内容printf("Thread %d 排序后%d文件内容:\n",thread_num,index);fp=fopen(filePathList[index],"w");//覆写for(j=0; j<i; j++) {printf("%d ",t[j]);fprintf(fp,"%d ",t[j]);}printf("\n");fclose(fp);index+=2;//下一个文件下标}
}
//线程2排序 1、3、5、7、9
void funTwo(int thread_num) {printf("Thread: %d running...\n",thread_num);//先读取文件里内容后排序,最后覆盖写入FILE *fp;int index=1;//开始的文件下标while(index<10) {fp=fopen(filePathList[index],"r");//只读int t[1024];//存放读取的文件内容int i=0,j;printf("Thread %d 读取%d文件内容:\n",thread_num,index);while(fscanf(fp,"%d",&t[i])>0) {//读取数字printf("%d ",t[i]);i++;}printf("\n");fclose(fp);qsort(t,i,sizeof(t[0]),cmp);//排序文件内容printf("Thread %d 排序后%d文件内容:\n",thread_num,index);fp=fopen(filePathList[index],"w");//覆写for(j=0; j<i; j++) {printf("%d ",t[j]);fprintf(fp,"%d ",t[j]);}printf("\n");fclose(fp);index+=2;//下一个文件下标}
}int main() {char t[]= {"/home/kailang/pthread/2/"};//路径的公共部分int i,j;//拼接路径+文件名[0~9]for(j=0; j<10; j++) {for(i=0; t[i]!='\0'; i++) {filePathList[j][i]=t[i];}filePathList[j][i]=j+'0';//加上文件名filePathList[j][i+1]='\0';//以\0结束}//打印路径for(j=0; j<10; j++) {puts(filePathList[j]);}//创建线程if(pthread_create(&id1,NULL,(void *) funOne,0)!=0) {printf("pthread_create error!");return -1;}if(pthread_create(&id2,NULL,(void *) funTwo,1)!=0) {printf("pthread_create error!");return -1;}//等待线程执行结束pthread_join(id1,NULL);pthread_join(id2,NULL);return 0;
}
三、运行截图
首先需要10个要排序的文件,程序执行后会将排序好的内容覆盖掉原来的文件内容
多线程并发执行下,每次打印的信息不太一样,但最终保存到文件的排序结果是一样的 。
四、总结
该程序用到了存储路径的全局变量,而且每个线程处理的文件没有冲突,所以代码里不需要互斥锁或条件变量来实现。
Linux下C语言实现多线程排序文件内容相关推荐
- linux 修改文件内容sed,linux下通过sed命令直接修改文件内容
linux下通过sed命令直接修改文件内容 sed是实现对流的编辑.通常,我们使用sed可以实现内容的编辑后然后保存成另外的一个文件,如果正确的话,才写入到源文件.但是某些时候,我们需要直接修改文件, ...
- 关于Linux下C语言开发基础的实验内容。
Linux下C语言开发基础实验内容 目录 1.Linux下C语言开发流程 2.vi,vim编辑器的使用 3.Gcc编译器的使用 总体选项: 警告选项: 4.GDB 基本命令的使用 5.Make 工程管 ...
- Linux下C语言的系统头文件
Linux菜鸟初看Linux下编程的糗事. 前段时间琢磨着接触一下Linux下的C语言编程,就找了本书看.看到很多文件操作的程序要包含"sys/stat.h". 写程序前,我想先找 ...
- linux下不解包查看tar包文件内容
为减少日志文件占用的空间,很多情况下我们会将日志文件以天或周为周期打包成tar.gz 包保存.虽然这样做有利空间充分利用,但当我们想查看压缩包内的内容时确很不方便.如果只是一个tar.gz文件,可以将 ...
- linux如何查看tar的文件,linux下不解包查看tar包文件内容
为减少日志文件占用的空间,很多情况下我们会将日志文件以天或周为周期打包成tar.gz 包保存.虽然这样做有利空间充分利用,但当我们想查看压缩包内的内容时确很不方便.如果只是一个tar.gz文件,可以将 ...
- Linux下c语言TCP多线程聊天室
前言 开发环境:Linux(ubuntu 12.04),GCC 编译: gcc server.c -lpthread -std=gnu99 -o s gcc client.c -lpthread -s ...
- linux cat 查看文件内容 不带#号的,Linux下如何不用cat命令读取文件内容
本文最后更新于2018年1月28日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢! =Start= 缘由: 在微信群里看到的一个讨论,觉得挺有启发意义的,所以在此整理一下,方便以后学习 ...
- 利用多线程实现linux下C语言的聊天室程序:
转载:http://www.360doc.com/content/16/0421/11/478627_552531090.shtml 利用多线程实现linux下C语言的聊天室程序: 客户端代码: th ...
- copy文件的Linux程序代码,Linux下C语言实现CopyFile
Linux下C语言实现文件拷贝 /* Function:copy file from file1 to file2 How to execute: ./copyfile file1 file2 ( ...
最新文章
- python venv windows7_安装 Python、pip 和 venv
- Linux中sort、uniq、cut、wc命令详解
- SQL点滴35—SQL语句中的exists
- [C++]头文件(Header Files)和命名空间(Namespace)
- jquery 下载 安装 浏览器支持
- 关系数据库设计理论--3NF
- 用手画了11张图终于搞明白了Git工作流,我怀疑你用的是假 Git
- 电脑连接热点无internet访问权限_Win10连接wifi后显示无internet访问权限如何解决...
- 网关、路由器、交换机
- 儿童学习与发展指南《倾听与表达》篇
- 小酷智慧地图3D导览v1.0.82 打卡定位 地图打卡
- COLMAP: Structure-from-Motion Revisited
- 聪明人的游戏提高篇:贝贝的数学课 (change)
- dell灵越笔记本后盖怎么拆_戴尔inspiron15 5547笔记本怎么拆机清灰?
- word2vec关键词提取 python_如何从word2vec的Google预训练模型中提取单词向量?
- 数据类型---原始数据类型
- 小米8青春版刷入Ubuntu Touch教程
- 基于JAVA高校体育场馆管理计算机毕业设计源码+数据库+lw文档+系统+部署
- 对于戴尔AWCC占用WMI Provider Host过多资源造成的随机性卡顿解决方法
- 《2013传智播客视频》-wmv,avi,mp4.目录