当前位置:   article > 正文

关于进程间通信的练习

关于进程间通信的练习

1> 使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上
一份

create.c

  1. #include<myhead.h>
  2. int main(int argc, const char *argv[])
  3. {
  4. //创建一个管道文件
  5. if(mkfifo("./linux",0664)==-1)
  6. {
  7. perror("mkfifo error");
  8. return -1;
  9. }
  10. return 0;
  11. }

snd.c

  1. #include<myhead.h>
  2. int main(int argc, const char *argv[])
  3. {
  4. //已只写的形式打开管道文件
  5. int wfd=open("./linux",O_WRONLY);
  6. if(wfd==-1)
  7. {
  8. perror("open error");
  9. return -1;
  10. }
  11. printf("管道文件已打开\n");
  12. //往里面写东西
  13. char wbuf[128]="";
  14. while(1)
  15. {
  16. //从终端获取要写入的内容
  17. printf("请输入>>>");
  18. fgets(wbuf,sizeof(wbuf),stdin);
  19. wbuf[strlen(wbuf)-1]='\0';
  20. //将数据发送到管道文件中
  21. write(wfd,wbuf,sizeof(wbuf));
  22. //判断写入的文件
  23. if(strcmp(wbuf,"quit")==0)
  24. {
  25. break;
  26. }
  27. }
  28. //关闭文件
  29. close(wfd);
  30. return 0;
  31. }

recv.c

  1. #include<myhead.h>
  2. int main(int argc, const char *argv[])
  3. {
  4. //以只读的形式打开管道文件
  5. int rfd=open("./linux",O_RDONLY);
  6. if(rfd==-1)
  7. {
  8. perror("open error");
  9. return -1;
  10. }
  11. printf("管道文件已打开\n");
  12. //已只写的形式打开文件
  13. int fd1=open("./file.text",O_WRONLY|O_CREAT|O_TRUNC,0664);
  14. if(fd1==-1)
  15. {
  16. perror("open error");
  17. return -1;
  18. }
  19. char rbuf[128]="";
  20. while(1)
  21. {
  22. //清空容器
  23. bzero(rbuf,sizeof(rbuf));
  24. //读取信息
  25. read(rfd,rbuf,sizeof(rbuf));
  26. //判断读取的文件
  27. if(strcmp(rbuf,"quit")==0)
  28. {
  29. break;
  30. }
  31. //将读取内容展示到终端
  32. printf("%s\n",rbuf);
  33. //将读取的内容写入到文件中
  34. write(fd1,rbuf,sizeof(rbuf));
  35. //手动添加换行
  36. char a='\n';
  37. write(fd1,&a,1);
  38. }
  39. //关闭文件
  40. close(rfd);
  41. return 0;
  42. }

2> 使用有名管道实现两个进程间相互通信

create.c

  1. #include<myhead.h>
  2. int main(int argc, const char *argv[])
  3. {
  4. //创建管道1
  5. if(mkfifo("./liunx1",0664)==-1)
  6. {
  7. perror("mkfifo error");
  8. return -1;
  9. }
  10. //创建管道2
  11. if(mkfifo("./liunx2",0664)==-1)
  12. {
  13. perror("mkfifo error");
  14. return -1;
  15. }
  16. return 0;
  17. }

snd.c

  1. #include<myhead.h>
  2. int main(int argc, const char *argv[])
  3. {
  4. //创建管道1
  5. if(mkfifo("./liunx1",0664)==-1)
  6. {
  7. perror("mkfifo error");
  8. return -1;
  9. }
  10. //创建管道2
  11. if(mkfifo("./liunx2",0664)==-1)
  12. {
  13. perror("mkfifo error");
  14. return -1;
  15. }
  16. return 0;
  17. }
  18. ubuntu@ubuntu:work2$ cat snd.c
  19. #include<myhead.h>
  20. int main(int argc, const char *argv[])
  21. {
  22. pid_t pid=fork();
  23. if(pid<0)
  24. {
  25. perror("fork error");
  26. return -1;
  27. }
  28. else if(pid==0)
  29. {
  30. //以只写的形式打开管道2
  31. int wfd=open("./liunx2",O_WRONLY);
  32. if(wfd==-1)
  33. {
  34. perror("open error");
  35. return -1;
  36. }
  37. char wbuf[128]="";
  38. while(1)
  39. {
  40. printf("请输入>>>");
  41. //把终端输入的内容写入容器中
  42. fgets(wbuf,sizeof(wbuf),stdin);
  43. wbuf[strlen(wbuf)-1]=0;
  44. //再写入到管道文件中
  45. write(wfd,wbuf,strlen(wbuf));
  46. //判断写入的内容
  47. if(strcmp(wbuf,"quit")==0)
  48. {
  49. break;
  50. }
  51. }
  52. //关闭文件
  53. close(wfd);
  54. exit(EXIT_SUCCESS);
  55. }
  56. //以只读的形式打开管道1
  57. int rfd=open("./liunx1",O_RDONLY);
  58. if(rfd==-1)
  59. {
  60. perror("open error");
  61. return -1;
  62. }
  63. char rbuf[128]="";
  64. while(1)
  65. {
  66. //清空容器
  67. bzero(rbuf,sizeof(rbuf));
  68. //读取管道1中的内容
  69. read(rfd,rbuf,sizeof(rbuf));
  70. if(strcmp(rbuf,"quit")==0)
  71. {
  72. break;
  73. }
  74. printf("收到的信息为:%s\n",rbuf);
  75. }
  76. //关闭文件
  77. close(rfd);
  78. wait(NULL);
  79. return 0;
  80. }

recv.c

  1. #include<myhead.h>
  2. int main(int argc, const char *argv[])
  3. {
  4. pid_t pid=fork();
  5. if(pid<0)
  6. {
  7. perror("fork error");
  8. return -1;
  9. }
  10. else if(pid==0)
  11. {
  12. //以只读的形式打开管道2
  13. int rfd=open("./liunx2",O_RDONLY);
  14. if(rfd==-1)
  15. {
  16. perror("open error");
  17. return -1;
  18. }
  19. char rbuf[128]="";
  20. while(1)
  21. {
  22. //清空容器
  23. bzero(rbuf,sizeof(rbuf));
  24. //读取管道1中的内容
  25. read(rfd,rbuf,sizeof(rbuf));
  26. if(strcmp(rbuf,"quit")==0)
  27. {
  28. break;
  29. }
  30. printf("收到的信息为:%s\n",rbuf);
  31. }
  32. //关闭文件
  33. close(rfd);
  34. exit(EXIT_SUCCESS);
  35. }
  36. //以只写的形式打开管道1
  37. int wfd=open("./liunx1",O_WRONLY);
  38. if(wfd==-1)
  39. {
  40. perror("open error");
  41. return -1;
  42. }
  43. char wbuf[128]="";
  44. while(1)
  45. {
  46. printf("请输入>>>");
  47. //把终端输入的内容写入容器中
  48. fgets(wbuf,sizeof(wbuf),stdin);
  49. wbuf[strlen(wbuf)-1]=0;
  50. //再写入到管道文件中
  51. write(wfd,wbuf,strlen(wbuf));
  52. //判断写入的内容
  53. if(strcmp(wbuf,"quit")==0)
  54. {
  55. break;
  56. }
  57. }
  58. //关闭文件
  59. close(wfd);
  60. wait(NULL);
  61. return 0;
  62. }

思维导图

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/936269
推荐阅读
相关标签
  

闽ICP备14008679号