• 有名管道及其应用


    创建FIFO文件

        1.通过命令: mkfifo + 文件名

        2.通过函数: mkfifo

        #include

        #include

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

        参数:

            -pathname:管道名称的路径

            -mode:文件的权限,和open的mode是一样的,是一个八进制的数

        返回值:

            成功返回0,失败返回-1,并设置错误号

    有名管道的注意事项

        1.一个为只读而打开一个管道的进程会阻塞,直到另外一个进程为只写打开管道

        2.一个为只写而打开一个管道的进程会阻塞,直到另外一个进程为只读打开管道

        读管道:

            管道中有数据,read返回实际读到的字节数

            管道中无数据:

                管道写端被全部关闭,read返回0,(相当于读到文件末尾)

                写端没有被全部关闭,read阻塞等待

        写管道:

            管道读端被全部关闭,进程异常终止(收到一个SIGPIPE信号)

            管道读端没有全部关闭:

                管道已经满了,write会阻塞

                管道没有满,write将数据写入,并返回实际写入的字节数

    有名管道实现简单版聊天功能

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. int main() {
    9. //1.判断有名管道文件是否存在
    10. int ret = access("fifo1", F_OK);
    11. if(ret == -1) {
    12. //文件不存在
    13. printf("管道不存在,创建对应的有名管道\n");
    14. ret = mkfifo("fifo1", 0664);
    15. if(ret == -1) {
    16. perror("mkfifo");
    17. exit(0);
    18. }
    19. }
    20. ret = access("fifo2", F_OK);
    21. if(ret == -1) {
    22. //文件不存在
    23. printf("管道不存在,创建对应的有名管道\n");
    24. ret = mkfifo("fifo2", 0664);
    25. if(ret == -1) {
    26. perror("mkfifo");
    27. exit(0);
    28. }
    29. }
    30. //2.以只写的方式打开管道1
    31. int fdw = open("fifo1", O_WRONLY);
    32. if(fdw == -1) {
    33. perror("open");
    34. exit(0);
    35. }
    36. printf("打开fifo1成功,等待写入数据...\n");
    37. //3.以只读的方式打开管道2
    38. int fdr = open("fifo2", O_RDONLY);
    39. if(fdr == -1) {
    40. perror("open");
    41. exit(0);
    42. }
    43. printf("打开fifo2成功,等待读取数据...\n");
    44. char buf[128];
    45. //4.循环地写读数据
    46. //往管道写数据
    47. while(1) {
    48. memset(buf, 0, 128);
    49. //获取标准输入的数据
    50. fgets(buf, 128, stdin);
    51. //写数据
    52. ret = write(fdw, buf, strlen(buf));
    53. if(ret == -1) {
    54. perror("write");
    55. exit(0);
    56. }
    57. }
    58. //读管道数据
    59. while(1) {
    60. memset(buf, 0, 128);
    61. ret = read(fdr, buf, 128);
    62. if(ret <= 0) {
    63. perror("read");
    64. break;
    65. }
    66. printf("buf: %s\n", buf);
    67. }
    68. //5.关闭文件描述符
    69. close(fdw);
    70. close(fdr);
    71. return 0;
    72. }
    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. int main() {
    9. //1.判断有名管道文件是否存在
    10. int ret = access("fifo1", F_OK);
    11. if(ret == -1) {
    12. //文件不存在
    13. printf("管道不存在,创建对应的有名管道\n");
    14. ret = mkfifo("fifo1", 0664);
    15. if(ret == -1) {
    16. perror("mkfifo");
    17. exit(0);
    18. }
    19. }
    20. ret = access("fifo2", F_OK);
    21. if(ret == -1) {
    22. //文件不存在
    23. printf("管道不存在,创建对应的有名管道\n");
    24. ret = mkfifo("fifo2", 0664);
    25. if(ret == -1) {
    26. perror("mkfifo");
    27. exit(0);
    28. }
    29. }
    30. //2.以只读的方式打开管道1
    31. int fdr = open("fifo1", O_RDONLY);
    32. if(fdr == -1) {
    33. perror("open");
    34. exit(0);
    35. }
    36. printf("打开fifo1成功,等待读取数据...\n");
    37. //3.以只写的方式打开管道2
    38. int fdw = open("fifo2", O_WRONLY);
    39. if(fdw == -1) {
    40. perror("open");
    41. exit(0);
    42. }
    43. printf("打开fifo2成功,等待写入数据...\n");
    44. char buf[128];
    45. //4.循环地读写数据
    46. //读管道数据
    47. while(1) {
    48. memset(buf, 0, 128);
    49. ret = read(fdr, buf, 128);
    50. if(ret <= 0) {
    51. perror("read");
    52. break;
    53. }
    54. printf("buf: %s\n", buf);
    55. }
    56. //往管道写数据
    57. while(1) {
    58. memset(buf, 0, 128);
    59. //获取标准输入的数据
    60. fgets(buf, 128, stdin);
    61. //写数据
    62. ret = write(fdw, buf, strlen(buf));
    63. if(ret == -1) {
    64. perror("write");
    65. exit(0);
    66. }
    67. }
    68. //5.关闭文件描述符
    69. close(fdw);
    70. close(fdr);
    71. return 0;
    72. }

  • 相关阅读:
    【AGC】通过AGC认证服务在Android平台实现华为账号登录功能
    第二十二章 : Docker 部署 MySQL8
    网络套接字(Udp实现简单的网络通信)
    Java不能操作内存?Unsafe了解一下
    机器人——力控
    【华为OD机试真题 python】 字符串比较【2022 Q4 | 200分】
    【目标检测算法】利用wandb可视化YOLO-V5模型的训练
    kafka生产者源码精华总结
    微服务架构的优缺点都有哪些?
    调度器/调度程序
  • 原文地址:https://blog.csdn.net/ME_Liao_2022/article/details/133183061