• Linux操作系统:多进程拷贝


    多个进程读同一文件,拷贝到目标文件。(是为了提高效率)

    子进程 copy 文件进程:

    参数:源文件、目标文件、文件起始位置、文件块大小

    1.打开源文件----read

    2.打开目标文件---write

    3.移动源文件指针到目标位置

    4.移动目标文件指针到目标位置

    5.从源文件读目标大小

    6.从目标文件写入目标大小的内容

    7.关闭源文件,目标文件

    父进程:

    参数:源文件、目标文件、进程数

    1.校验参数(源文件是否存在)

    2.将文件切片(获取文件大小/进程数)

    3.创建子进程(子进程复制拷贝文件)

    4.回收子进程(僵尸进程

    系统io和文件io的区别

    open、read和fopen、fread:

    标准文件io:自带缓冲区。需要从自己的缓冲区拷贝到内核,在从内核拷贝到磁盘,实时性不好,但是可以跨系统

    系统io:直接从内核缓冲区拷贝到内核中,实时性好,只属于linux系统

    子进程:

    1. 1 #include
    2. 2 #include
    3. 3 #include
    4. 4 #include
    5. 5 #include
    6. 6 #include
    7. 7 #include
    8. 8
    9. 9 int arg_check(const char* srcfile, int pronumber)
    10. 10 {
    11. 11 if(access(srcfile,F_OK) == -1)
    12. 12 {
    13. 13 perror("源文件不存在");
    14. 14 exit(0);
    15. 15 }
    16. 16 if(pronumber <= 0 || pronumber > 100)
    17. 17 {
    18. 18 perror("进程的数量请在[0-100]范围内");
    19. 19 exit(0);
    20. 20 }
    21. 21 return 0;
    22. 22 }
    23. 23 int block_cur(const char* srcfile,int pronumber)
    24. 24 {
    25. 25 //获取文件大小
    26. 26 int srcfd = open(srcfile,O_RDONLY);
    27. 27 int filesize = lseek(srcfd,0,SEEK_END);
    28. 28 if(filesize % pronumber == 0)
    29. 29 return filesize/pronumber;
    30. 30 else
    31. 31 return filesize/pronumber + 1;
    32. 32 }
    33. 33 int process_create(const char* srcfile, const char* desfile,int pronumber, int blocksize)
    34. 34 {
    35. 35 pid_t pid;
    36. 36 int flags;
    37. 37 for(flags = 0; flags < pronumber; flags++)
    38. 38 {
    39. 39 pid = fork();
    40. 40 if(pid == 0)
    41. 41 break;
    42. 42 }
    43. 43 if(pid > 0)
    44. 44 {
    45. 45 printf("process_create success...\n");
    46. 46 }
    47. 47 else if(pid == 0)
    48. 48 {
    49. 49 int npos = flags * blocksize;
    50. 50 char szblocksize[10];
    51. 51 char szpos[10];
    52. 52 sprintf(szpos,"%d",npos);
    53. 53 sprintf(szblocksize,"%d",blocksize);
    54. 54 printf("child process id[%d],file start pos [%d],blocksize[%d]\n",getpid(),npos,blocksize);
    55. 55 execl("/home/buka/0365file/processcopy/copy","copy",srcfile,desfile,szpos,szblocksize,NULL);
    56. 56 }
    57. 57 return 0;
    58. 58 }
    59. 59
    60. 60 int main(int argc, char** argv)
    61. 61 {
    62. 62 if(argc < 3)
    63. 63 {
    64. 64 perror("参数不足,请重新填写");
    65. 64 perror("参数不足,请重新填写");
    66. 65 exit(0);
    67. 66 }
    68. 67 int pronumber;
    69. 68 if(argv[3] == 0)
    70. 69 pronumber = 5;
    71. 70 else
    72. 71 pronumber = atoi(argv[3]);
    73. 72 //1.校验参数(源文件、目标文件、进程数)
    74. 73 arg_check(argv[1],pronumber);
    75. 74 //if(pronumber == 0)
    76. 75 // pronumber = 5;
    77. 76 //2.数据切片(将文件切为指定大小)
    78. 77 int nblocksize = block_cur(argv[1],pronumber);
    79. 78 //3.子进程的创建与拷贝
    80. 79 process_create(argv[1],argv[2],pronumber,nblocksize);
    81. 80 //4.回收子进程(僵尸进程)
    82. 81 pid_t zid;
    83. 82 while((zid = waitpid(-1,0,WNOHANG)) != -1)
    84. 83 {
    85. 84 if(zid > 0)
    86. 85 {
    87. 86 printf("zombie process id [%d]\n",zid);
    88. 87 }
    89. 88 }
    90. 89
    91. 90
    92. 91
    93. 92 return 0;
    94. 93 }

    父进程:

    1. 1 #include
    2. 2 #include
    3. 3 #include
    4. 4 #include
    5. 5 #include
    6. 6 #include
    7. 7
    8. 8 int main(int arg, char** argv)
    9. 9 {
    10. 10 //1.校验参数 源文件、目标文件、起始位置、文件块大小
    11. 11 if(arg < 4){
    12. 12 perror("参数不足");
    13. 13 exit(0);
    14. 14 }
    15. 15 //2.打开源文件--read
    16. 16 int srcfd = open(argv[1],O_RDONLY);
    17. 17 if(srcfd == -1)
    18. 18 {
    19. 19 perror("open read file failed");
    20. 20 exit(0);
    21. 21 }
    22. 22 //3.打开目标文件--write
    23. 23 int desfd = open(argv[2],O_WRONLY|O_CREAT,0664);
    24. 24 if(desfd == -1)
    25. 25 {
    26. 26 perror("open write file failed");
    27. 27 exit(0);
    28. 28 }
    29. 29 //4.移动源文件指针
    30. 30 int npos = atoi(argv[3]);
    31. 31 lseek(srcfd,npos,SEEK_SET);
    32. 32 //5.移动目标文件指针
    33. 33 lseek(desfd,npos,SEEK_SET);
    34. 34 //6.读源文件内容
    35. 35 int nbuffersize = atoi(argv[4]);
    36. 36 char szbuf[nbuffersize];
    37. 37 int readlen = read(srcfd,szbuf,nbuffersize);
    38. 38 if(readlen == -1)
    39. 39 {
    40. 40 perror("read file erro");
    41. 41 exit(0);
    42. 42 }
    43. 43 //7.项目表文件写入文件内容
    44. 44 write(desfd,szbuf,readlen);
    45. 45 //8.关闭源文件、目标文件
    46. 46 close(srcfd);
    47. 47 close(desfd);
    48. 48
    49. 49
    50. 50 return 0;
    51. 51 }

  • 相关阅读:
    python执行pip指令时,提示“You should consider upgrading……”的解决方法
    这个面试题居然从11年前就开始讨论了,而官方今年才表态。
    鸿蒙HarmonyOS实战-Stage模型(服务卡片的模块和创建)
    geohash学习
    java-ssm-基于jsp商场停车服务管理信息系统
    ChatGPT、New Bing、文心一言、通义千问等 AI 工具到底哪个更AI? - 第二期
    Codeforces Round #836 (Div. 2) A-D
    Yolov5进阶之五GPU环境搭建
    三菱PLC FX3U脉冲轴点动功能块(MC_Jog)
    SpringMVC工作流程(详-小白版)
  • 原文地址:https://blog.csdn.net/m0_69414302/article/details/127662727