• IO和进程day07(IPC、管道、信号)


    今日任务

    1.代码(一次只能发一次消息,不然会存在一些小问题,在接受消息之后会立刻输出上次的第二次发送的消息)

    read.c文件(先读取消息)

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. int main(int argc, const char *argv[])
    10. {
    11. //创建打开第一个管道文件
    12. if(-1==mkfifo("./fifo1",0664)){
    13. if(17!=errno){
    14. perror("mkfifo1");
    15. return -1;
    16. }
    17. }
    18. puts("create pipe1 success");
    19. //打开管道文件
    20. int fd1=open("./fifo1",O_RDONLY);
    21. if(-1==fd1){
    22. perror("open1");
    23. return -1;
    24. }
    25. puts("open1 success");
    26. //创建打开第二个管道文件
    27. if(-1==mkfifo("./fifo2",0664)){
    28. if(17!=errno){
    29. perror("mkfifo2");
    30. return -1;
    31. }
    32. }
    33. puts("create pipe2 success");
    34. //打开管道文件
    35. int fd2=open("./fifo2",O_WRONLY);
    36. if(-1==fd2){
    37. perror("open2");
    38. return -1;
    39. }
    40. puts("open2 success");
    41. //读 写
    42. char buf1[128];
    43. char buf2[128];
    44. while(1){
    45. //读
    46. bzero(buf1,sizeof(buf1));
    47. int res=read(fd1,buf1,sizeof(buf1));
    48. if(res<0){
    49. perror("read");
    50. return -1;
    51. }else if(res==0){
    52. break;
    53. }else{
    54. printf("jack:%s\n",buf1);
    55. //fprintf(stdout,"jack:%s\n",buf1);
    56. }
    57. //写
    58. bzero(buf2,sizeof(buf2));
    59. //scanf("%s",buf2);
    60. fgets(buf2,sizeof(buf2),stdin);
    61. buf2[strlen(buf2)-1]='\0';
    62. if(strcmp(buf2,"quit")==0)
    63. break;
    64. if(-1==write(fd2,buf2,sizeof(buf2))){
    65. perror("write");
    66. return -1;
    67. }
    68. }
    69. //关闭
    70. close(fd1);
    71. close(fd2);
    72. return 0;
    73. }

    write.c文件(先发送消息的)

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. int main(int argc, const char *argv[])
    10. {
    11. //创建打开第一个管道文件
    12. if(-1==mkfifo("./fifo1",0664)){
    13. if(17!=errno){
    14. perror("mkfifo1");
    15. return -1;
    16. }
    17. }
    18. puts("create pipe1 success");
    19. //打开管道文件
    20. int fd1=open("./fifo1",O_WRONLY);
    21. if(-1==fd1){
    22. perror("open1");
    23. return -1;
    24. }
    25. puts("open1 success");
    26. //创建打开第二个管道文件
    27. if(-1==mkfifo("./fifo2",0664)){
    28. if(17!=errno){
    29. perror("mkfifo2");
    30. return -1;
    31. }
    32. }
    33. puts("create pipe2 success");
    34. //打开管道文件
    35. int fd2=open("./fifo2",O_RDONLY);
    36. if(-1==fd2){
    37. perror("open2");
    38. return -1;
    39. }
    40. puts("open2 success");
    41. char buf1[128];
    42. char buf2[128];
    43. while(1){
    44. //写
    45. bzero(buf1,sizeof(buf1));
    46. //scanf("%s",buf1);
    47. fgets(buf1,sizeof(buf1),stdin);
    48. buf1[strlen(buf1)-1]='\0';
    49. if(strcmp(buf1,"quit")==0)
    50. break;
    51. if(-1==write(fd1,buf1,sizeof(buf1))){
    52. perror("write");
    53. return -1;
    54. }
    55. //读
    56. bzero(buf2,sizeof(buf2));
    57. int res=read(fd2,buf2,sizeof(buf2));
    58. if(res<0){
    59. perror("read");
    60. return -1;
    61. }else if(res==0){
    62. break;
    63. }else{
    64. printf("rose:%s\n",buf2);
    65. //fprintf(stdout,"rose:%s\n",buf2);
    66. }
    67. }
    68. //关闭
    69. close(fd1);
    70. close(fd2);
    71. return 0;
    72. }

    运行结果

    2.代码(就是把代码1分别放到线程中就可以了,)

    jack.c文件

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. //线程1:读取
    11. void * fun1(void*arg){
    12. //创建打开第一个管道文件
    13. if(-1==mkfifo("./fifo1",0664)){
    14. if(17!=errno){
    15. perror("mkfifo1");
    16. return NULL;
    17. }
    18. }
    19. puts("create pipe1 success");
    20. //打开管道文件
    21. int fd1=open("./fifo1",O_WRONLY);
    22. if(-1==fd1){
    23. perror("open1");
    24. return NULL;
    25. }
    26. puts("open1 success");
    27. char buf1[128];
    28. while(1){
    29. //写
    30. bzero(buf1,sizeof(buf1));
    31. //scanf("%s",buf1);
    32. fgets(buf1,sizeof(buf1),stdin);
    33. buf1[strlen(buf1)-1]='\0';
    34. if(strcmp(buf1,"quit")==0)
    35. break;
    36. if(-1==write(fd1,buf1,sizeof(buf1))){
    37. perror("write");
    38. return NULL;
    39. }
    40. }
    41. close(fd1);
    42. pthread_exit(NULL);
    43. }
    44. //线程2:写出
    45. void * fun2(void*arg){
    46. //创建打开第二个管道文件
    47. if(-1==mkfifo("./fifo2",0664)){
    48. if(17!=errno){
    49. perror("mkfifo2");
    50. return NULL;
    51. }
    52. }
    53. puts("create pipe2 success");
    54. //打开管道文件
    55. int fd2=open("./fifo2",O_RDONLY);
    56. if(-1==fd2){
    57. perror("open2");
    58. return NULL;
    59. }
    60. puts("open2 success");
    61. char buf2[128];
    62. while(1){
    63. //读
    64. bzero(buf2,sizeof(buf2));
    65. int res=read(fd2,buf2,sizeof(buf2));
    66. if(res<0){
    67. perror("read");
    68. return NULL;
    69. }else if(res==0){
    70. break;
    71. }else{
    72. printf("rose:%s\n",buf2);
    73. //fprintf(stdout,"rose:%s\n",buf2);
    74. }
    75. }
    76. close(fd2);
    77. pthread_exit(NULL);
    78. }
    79. int main(int argc, const char *argv[])
    80. {
    81. //创建线程
    82. pthread_t th1,th2;
    83. if(0!=pthread_create(&th1,NULL,fun1,NULL)){
    84. puts("th1 create failed");
    85. return -1;
    86. }
    87. if(0!=pthread_create(&th2,NULL,fun2,NULL)){
    88. puts("th2 create failed");
    89. return -1;
    90. }
    91. pthread_join(th1,NULL);
    92. pthread_join(th2,NULL);
    93. return 0;
    94. }

    rose文件

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. //线程1:写出
    11. void * fun1(void* arg){
    12. //创建打开第一个管道文件
    13. if(-1==mkfifo("./fifo1",0664)){
    14. if(17!=errno){
    15. perror("mkfifo1");
    16. return NULL;
    17. }
    18. }
    19. puts("create pipe1 success");
    20. //打开管道文件
    21. int fd1=open("./fifo1",O_RDONLY);
    22. if(-1==fd1){
    23. perror("open1");
    24. return NULL;
    25. }
    26. puts("open1 success");
    27. char buf1[128];
    28. while(1){
    29. //读
    30. bzero(buf1,sizeof(buf1));
    31. int res=read(fd1,buf1,sizeof(buf1));
    32. if(res<0){
    33. perror("read");
    34. return NULL;
    35. }else if(res==0){
    36. break;
    37. }else{
    38. printf("jack:%s\n",buf1);
    39. //fprintf(stdout,"jack:%s\n",buf1);
    40. }
    41. }
    42. close(fd1);
    43. pthread_exit(NULL);
    44. }
    45. //线程2:读取
    46. void *fun2(void* arg){
    47. //创建打开第二个管道文件
    48. if(-1==mkfifo("./fifo2",0664)){
    49. if(17!=errno){
    50. perror("mkfifo2");
    51. return NULL;
    52. }
    53. }
    54. puts("create pipe2 success");
    55. //打开管道文件
    56. int fd2=open("./fifo2",O_WRONLY);
    57. if(-1==fd2){
    58. perror("open2");
    59. return NULL;
    60. }
    61. puts("open2 success");
    62. char buf2[128];
    63. while(1){
    64. //写
    65. bzero(buf2,sizeof(buf2));
    66. //scanf("%s",buf2);
    67. fgets(buf2,sizeof(buf2),stdin);
    68. buf2[strlen(buf2)-1]='\0';
    69. if(strcmp(buf2,"quit")==0)
    70. break;
    71. if(-1==write(fd2,buf2,sizeof(buf2))){
    72. perror("write");
    73. return NULL;
    74. }
    75. }
    76. close(fd2);
    77. pthread_exit(NULL);
    78. }
    79. int main(int argc, const char *argv[])
    80. {
    81. //创建线程
    82. pthread_t th1,th2;
    83. if(0!=pthread_create(&th1,NULL,fun1,NULL)){
    84. puts("th1 create failed");
    85. return -1;
    86. }
    87. if(0!=pthread_create(&th2,NULL,fun2,NULL)){
    88. puts("th2 create failed");
    89. return -1;
    90. }
    91. pthread_join(th1,NULL);
    92. pthread_join(th2,NULL);
    93. return 0;
    94. }

    运行结果

    今日思维导图

    to be honest,sometime my brain is shutdown .

  • 相关阅读:
    大数据Hadoop之——Hadoop 3.3.4 HA(高可用)原理与实现(QJM)
    美国零售电商平台Target,值得入驻吗?如何入驻?
    泰克示波器TDS210更换IPS彩色屏幕
    mybatis.spring.MyBatisSystemException【bug】
    k8s crd设置额外header
    32、学习 Java 中的注解(参照官方教程)
    MySQL进阶
    VOT Toolkit环境配置与使用
    技术对比:Flutter vs. 传统桌面应用开发框架
    Python 算法高级篇:布谷鸟哈希算法与分布式哈希表
  • 原文地址:https://blog.csdn.net/weixin_53762703/article/details/132865708