• 无名管道与有名管道(FIFO)的应用


    1、无名管道

    1)、特点:

    只能用于具有亲缘关系的进程之间的通信

    半双工的通信模式,具有固定的读端和写端

    管道可以看成是一种特殊的文件,对于它的读写可以使用文件IO如read、write函数。

    #include

    int pipe(int pipefd[2]);  //创建管道,得到管道的读端fd[0]和写端fd[1]

    参数:

        pipefd ---- 存放读写文件描述符的数组首地址

    返回值:

        成功: 0

        失败: -1, 并设置errno

    1. #include
    2. #include
    3. #include
    4. #include
    5. int main(int argc, char *argv[])
    6. {
    7. pid_t pid;
    8. char buf[100];
    9. int ret;
    10. int fd[2];
    11. if (0 > pipe(fd))
    12. {
    13. perror("pipe");
    14. return -1;
    15. }
    16. printf("fd: %d %d\n", fd[0], fd[1]);
    17. if (0 > (pid = fork()))
    18. {
    19. perror("fork");
    20. return -1;
    21. }
    22. else if (0 == pid) //child:write
    23. {
    24. close(fd[0]);
    25. while (1)
    26. {
    27. printf("Child input: ");
    28. fgets(buf, sizeof(buf), stdin);
    29. if (0 > write(fd[1], buf, sizeof(buf)))
    30. {
    31. perror("write");
    32. break;
    33. }
    34. if (strncmp(buf, "quit", 4) == 0)
    35. break;
    36. }
    37. close(fd[1]);
    38. }
    39. else //parent: read
    40. {
    41. close(fd[1]);
    42. while (1)
    43. {
    44. ret = read(fd[0], buf, sizeof(buf));
    45. if (ret < 0)
    46. {
    47. perror("read");
    48. break;
    49. }
    50. else if (0 == ret)
    51. {
    52. printf("read end!\n");
    53. break;
    54. }
    55. else
    56. printf("Parent recv: %s", buf);
    57. }
    58. close(fd[0]);
    59. }
    60. return 0;
    61. }

    2、有名管道FIFO

    无名管道只能用于具有亲缘关系的进程之间,这就限制了无名管道的使用范围

    有名管道可以使互不相关的两个进程互相通信。有名管道可以通过路径名来指出,并且在文件系统中可见

    进程通过文件IO来操作有名管道

    有名管道遵循先进先出规则

    不支持如lseek() 操作

    有名管道的内容保存在内存中

    #include

    #include

    int mkfifo(const char *pathname, mode_t mode);

    参数:

        pathname --- 路径 + 名字

        mode     --- 权限,一般0664

    返回值:

        成功: 0

        失败: -1, 并设置errno

    使用: open close  read  write

    有名管道的创建(mkfifo):

    1. #include
    2. #include
    3. #include
    4. int main(int argc, char *argv[])
    5. {
    6. if (0 > mkfifo("myfifo", 0664))
    7. {
    8. perror("mkfifo");
    9. return -1;
    10. }
    11. return 0;
    12. }

    有名管道的读(read):

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. int main(int argc, char *argv[])
    7. {
    8. int fd = open("myfifo", O_RDONLY);
    9. if (fd < 0)
    10. {
    11. perror("open");
    12. return -1;
    13. }
    14. char buf[100];
    15. int ret;
    16. while (1)
    17. {
    18. ret = read(fd, buf, sizeof(buf));
    19. if (ret < 0)
    20. {
    21. perror("read");
    22. break;
    23. }
    24. else if (0 == ret)
    25. {
    26. printf("read end!\n");
    27. break;
    28. }
    29. printf("recv: %s\n", buf);
    30. }
    31. close(fd);
    32. return 0;
    33. }

    有名管道的写(write):

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. int main(int argc, char *argv[])
    8. {
    9. int fd = open("myfifo", O_WRONLY);
    10. if (fd < 0)
    11. {
    12. perror("open");
    13. return -1;
    14. }
    15. char buf[100];
    16. int ret;
    17. while (1)
    18. {
    19. printf("Input: ");
    20. fgets(buf, sizeof(buf), stdin);
    21. ret = write(fd, buf, sizeof(buf));
    22. if (ret < 0)
    23. {
    24. perror("write");
    25. break;
    26. }
    27. if (strncmp(buf, "quit", 4) == 0)
    28. break;
    29. }
    30. close(fd);
    31. return 0;
    32. }

    ==总结==

    * 管道只有在读写端存在时才有意义

    * 写端存在时,当管道中有数据时,读端可以读到数据,没有数据时,读端阻塞。但是写端关闭时,读端会把管道中的数据都读走后返回0

    * 当读端存在时但不读取数据,写端把管道缓冲区写满后会阻塞,直到读端读走数据就可以继续写入

    * 当读端关闭时,写端再向管道中写入,会出现管道破裂的信号(SIGPIPE)导致进程结束

    mkfifo  +文件名        (管道的创建)

  • 相关阅读:
    自学前端——HTML篇
    【生物信息学】使用皮尔逊相关系数进行相关性分析
    结构体学习
    小白入门深度学习 | 6-6:Inception v3 算法原理
    Transformer原理详解
    Linux: code: name: void dev_deactivate(struct net_device *dev)
    python技术栈 之 单元测试中mock的使用
    开源绘画应用 Pinta 已移植到GTK 3和.NET 6
    【Pytorch Lighting】第 10 章:扩展和管理培训
    rtems source builder 构建交叉编译工具链
  • 原文地址:https://blog.csdn.net/qq_63626307/article/details/126515490