• c 理解创建多进程


    下面的程序是创建n个打印进程

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <string.h>
    4. #include <unistd.h>
    5. #include <arpa/inet.h>
    6. #include <sys/socket.h>
    7. #include <sys/types.h>
    8. #include <wait.h>
    9. int main(void){
    10. int t=0;
    11. while(1){ //循环一次,父进程创建一新进程
    12. pid_t pid=fork(); //从这句后就是主程序创建一新进程,每个线程pid值选择自己执行的代码
    13. if(pid==0){ //子进程
    14. while(1){
    15. printf("%d:%d\n",getpid(),t);
    16. t++;
    17. sleep(1);
    18. }
    19. }else{ //父进程
    20. sleep(5);
    21. }
    22. }
    23. }

    在这个程序的基础上就会理解服务器的并行接收客户端的原理了,这种属于批量创建新进程,每个新进程执行相同的代码。

    采用多进程的并发服务器

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <string.h>
    4. #include <unistd.h>
    5. #include <arpa/inet.h>
    6. #include <sys/socket.h>
    7. int main(void){
    8. struct sockaddr_in serv,*p;
    9. memset(&serv,0,sizeof(serv));
    10. p=&serv;
    11. p->sin_family=AF_INET;
    12. p->sin_addr.s_addr=htonl(INADDR_ANY);
    13. p->sin_port=htons(3000);
    14. int sk=socket(PF_INET,SOCK_STREAM,0);
    15. if(sk==-1){
    16. puts("socket error\n");
    17. exit(1);
    18. }
    19. int opt=1;
    20. setsockopt(sk,SOL_SOCKET,SO_REUSEADDR,(void*)&opt,sizeof(opt)); //服务器地址复用
    21. if(bind(sk,(struct sockaddr*)&serv,sizeof(serv))==-1){
    22. puts("bind error\n");
    23. exit(1);
    24. }
    25. if(listen(sk,10)==-1){
    26. puts("listen error\n");
    27. exit(1);
    28. }
    29. puts("listening port\n");
    30. int n=0;
    31. while(n<50){
    32. pid_t pid=fork(); //父进程创建子进程,新进程数控制50
    33. if(pid==0){
    34. while(1){
    35. int ck=accept(sk,NULL,NULL);
    36. if(ck==-1){
    37. puts("accept error\n");
    38. exit(1);
    39. }
    40. //-----------------------------------------------------------------
    41. int t=0; //发送一个自增数到客户端
    42. while(1){
    43. write(ck,&t,sizeof(t));
    44. sleep(1); //暂停1
    45. t++;
    46. }
    47. }
    48. }else{ //父进程不执行代码,直接跳到accept状态
    49. n++;
    50. }
    51. }
    52. while(1){ //父进程产生50个新进程后循环等待,防止主程序退出,中止产生的新进程中止运行
    53. ;
    54. }
    55. return 0;
    56. }

     此程序一次产生50个accept新进程,所以可以同时接收50个客户端的接入。此程序未加入新进程的退出机制。

    加入子进程退出机制的多进程并发服务器

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <string.h>
    4. #include <unistd.h>
    5. #include <arpa/inet.h>
    6. #include <sys/socket.h>
    7. #include <wait.h>
    8. int main(void){
    9. struct sockaddr_in serv,*p;
    10. memset(&serv,0,sizeof(serv));
    11. p=&serv;
    12. p->sin_family=AF_INET;
    13. p->sin_addr.s_addr=htonl(INADDR_ANY);
    14. p->sin_port=htons(3000);
    15. int sk=socket(PF_INET,SOCK_STREAM,0);
    16. if(sk==-1){
    17. puts("socket error\n");
    18. exit(1);
    19. }
    20. int opt=1;
    21. setsockopt(sk,SOL_SOCKET,SO_REUSEADDR,(void*)&opt,sizeof(opt)); //服务器地址复用
    22. if(bind(sk,(struct sockaddr*)&serv,sizeof(serv))==-1){
    23. puts("bind error\n");
    24. exit(1);
    25. }
    26. if(listen(sk,10)==-1){
    27. puts("listen error\n");
    28. exit(1);
    29. }
    30. puts("listening port\n");
    31. int stat;
    32. while(1){
    33. int ck=accept(sk,NULL,NULL); //父进程停留在这里,如连接到客户端,则产生一新子进程
    34. if(ck==-1){
    35. puts("accept error\n");
    36. continue;
    37. }else{
    38. puts("one client linking...");
    39. }
    40. pid_t pid=fork();
    41. if(pid==0){ //子进程开始
    42. int t=0;
    43. while(t<10){
    44. write(ck,&t,sizeof(t));
    45. sleep(1);
    46. t++;
    47. }
    48. close(sk);
    49. close(ck);
    50. exit(0); //非常重要,子进程发出停止信号
    51. }
    52. close(ck); //非常重要,如没有这句,客户端不退出
    53. waitpid(-1,&stat,WNOHANG); //父进程关闭停止的子进程
    54. }
    55. return 0;
    56. }

    1此程序accept在fork语句前,所以不会一次生成多个子进程,而是连接一个客户端后才生成一个新进程。

     

     

     

     

     

  • 相关阅读:
    SpringBoot连接Redis与Redisson【代码】
    B. Snow Walking Robot
    应遵循哪些 GitLab 备份最佳实践
    组合计数3以及高斯消元
    云组机命名
    单元测试pytest
    每周统计-20240531
    645仪表以JSON格式上发方法
    【运维心得】如何进行应用日志分析?
    Kafka事务「原理剖析」
  • 原文地址:https://blog.csdn.net/m0_59802969/article/details/133552254