linux多核多进程访问文件示例程序(每个核上运行一个程序)
2017-10-12 19:16
323 查看
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/sysinfo.h> #include <errno.h> #include <unistd.h> #include <fcntl.h> #include <sys/stat.h> #define __USE_GNU #include <sched.h> #include <ctype.h> #include <string.h> #include <pthread.h> #define THREAD_MAX_NUM 100 int num; void *threadWrite(void *arg) { cpu_set_t mask; cpu_set_t get; int *a = (int *)arg; printf("the a is :%d\n",*a); char buf2[]={"abcdefghijklmnopqrstuvwxyz"}; //要写入的信息 int fd2 = open("test",O_RDWR); //打开要写入的文件 if(fd2 == -1) { printf("open failed\n"); return ; } printf("success fd = %d\n",fd2); CPU_ZERO(&mask); //清零mask CPU_SET(*a,&mask); //根据参出设置该进程运行在哪个核上(参数范围为0-3,因为有4个物理核) if(sched_setaffinity(0,sizeof(mask),&mask)==-1) //设定程序运行在哪个核上 { printf("warning:could not set CPU affinity,continuing...\n"); } CPU_ZERO(&get); if(sched_getaffinity(0,sizeof(get),&get)==-1) //读取在哪个核上运行的信息 { printf("warning:could not get thread affinity,continuing...\n"); } int i; for(i=0;i<num;i++) { if(CPU_ISSET(i,&get)) { printf("this thread %d is running processor:%d\n",i,i); } } while(1) { pwrite(fd2,buf2,strlen(buf2),0); //往文件中写入,pwrtie为可以设定偏移位置,也就可以保证文件的大小 sleep(1); } return NULL; } void *threadFun(void *arg) { cpu_set_t mask; cpu_set_t get; int *a = (int *)arg; printf("the a is :%d\n",*a); char buf1[1000]; //保存读取内容缓冲区 int fd1 = open("vimrc_bak",O_RDWR); //打开文件 if(fd1 == -1) { printf("open failed\n"); return ; } printf("success fd = %d\n",fd1); CPU_ZERO(&mask); //同样时设置进程运行在哪个核上 CPU_SET(*a,&mask); if(sched_setaffinity(0,sizeof(mask),&mask)==-1) { printf("warning:could not set CPU affinity,continuing...\n"); } CPU_ZERO(&get); if(sched_getaffinity(0,sizeof(get),&get)==-1) { printf("warning:could not get thread affinity,continuing...\n"); } int i; for(i=0;i<num;i++) { if(CPU_ISSET(i,&get)) { printf("this thread %d is running processor:%d\n",i,i); } } memset(buf1,0,sizeof(bu 4000 f1)); while(1) { if(read(fd1,buf1,sizeof(buf1))>0) //持续赋取文件内容,当读取到文件尾时,在从头开始 { printf("buf = %s\n",buf1); memset(buf1,0,sizeof(buf1)); sleep(1); } else { lseek(fd1,0,SEEK_SET); } } return NULL; } int main() { pthread_t thread[4]; int tid[4]; int i; num = sysconf(_SC_NPROCESSORS_CONF); //获取物理核的具体数 printf("system has %d processors\n",num); for(i=0;i<2;i++) //创建进程 { tid[i] = i; pthread_create(&thread[i],NULL,(void*)threadFun,(void*)&tid[i]); } for(i=2;i<4;i++) //创建进程 { tid[i] = i; pthread_create(&thread[i],NULL,(void*)threadWrite,(void*)&tid[i]); } for(i=0;i<4;i++) //等待进程运行完毕后再退出 { pthread_join(thread[i],NULL); } return 0; }
当时编写程序时的思路:
1,首先先写出来多进程的程序
2,在1的基础上把进程绑定到指定的物理核上
3,编写操作文件的读写函数
4,修改写函数,因为使用write函数持续写时,会导致文件随时间变的巨大,最后修改为pwrite
5,把两个程序结合到一起。
相关文章推荐
- 使用.bat文件运行Java程序的一个示例
- 使用.bat文件运行Java程序的一个示例
- 一个将java程序运行在linux系统后台的脚本
- 在Linux下,一个文件也有三种时间,分别是:访问时间、修改时间、状态改动时间
- 一个简单java小程序打包成EXE运行文件
- java下运行windows命令行程序(批处理文件)示例
- 分享一个linux下的C程序读取配置文件的方法
- 怎么控制程序只运行一个实例(使exe文件不被重复打开)
- 一个 Linux Windows下都可运行的 Socket 程序
- 自己写的一个LINUX 下目录文件遍历程序
- Linux下计算程序运行时间的一个简单方法
- linux 如何在文件系统启动后自动运行我的程序
- 一个用Dijkstra算法实现的路由算法的java程序——9 图信息文件示例
- linux 程序运行到后台,控制台输出到文件,并能日志切割的方法
- Linux系统中程序进程对文件的访问权限
- Java程序运行结果输出到一个文件中去,结果显示乱码
- squid coss文件系统的一个bug,运行程序core down
- 怎样把一个写好的程序,打包成一个文件。.exe的,这样我一点击就可以运行,好像网上说这个是绿色软件
- 延时程序几乎在每个单片机程序中都能看到,一个延时程序的好坏直接影响单片机的运行效率!
- 为什么一个程序在vs2005中,按F5运行,和直接运行exe文件结果不一样