找回密码
 立即注册
首页 资源区 代码 有名管道练习

有名管道练习

喙审 2025-5-29 10:55:59
  1. /********************************************************************************
  2. *
  3. * 在主程序中创建一个子程序,并在父进程中获取系统时间,并写入管道,子程序从管道中读取数据
  4. * author:jindouliu2024@163.com
  5. * date:2025.5.8
  6. * Copyright (c)  2024-2025   jindouliu2024@163.com   All right Reserved
  7. *
  8. ********************************************************************************/
  9. #include <stdio.h>
  10. #include <time.h>
  11. #include <sys/types.h>
  12. #include <string.h>
  13. #include <stdlib.h>
  14. #include <sys/stat.h>
  15. #include <unistd.h>
  16. #include <sys/wait.h>
  17. #include <fcntl.h>
  18. int main() {
  19.     time_t now;
  20.     struct tm *time_info;
  21.     char buffer[80];
  22.     char buffer1[80];
  23.     int fifo_fd;
  24.     // 创建有名管道
  25.     int ret = mkfifo("./fifo2", 0664);
  26.     if (ret == -1) {
  27.         perror("mkfifo failed");
  28.         return -1;
  29.     }
  30.     // 创建一个子进程
  31.     pid_t child_pid = fork();
  32.     if (child_pid > 0) {
  33.         // 父进程:以写模式打开管道
  34.         fifo_fd = open("./fifo2", O_WRONLY);
  35.         if (fifo_fd == -1) {
  36.             perror("open fifo failed");
  37.             return -1;
  38.         }
  39.         // 获取当前时间
  40.         now = time(NULL);
  41.         // 将时间转换为本地时间
  42.         time_info = localtime(&now);
  43.         // 格式化时间
  44.         strftime(buffer, sizeof(buffer), "当前时间:%Y年%m月%d日 %H:%M:%S", time_info);
  45.         // 向管道写入数据
  46.         ret = write(fifo_fd, buffer, strlen(buffer) + 1); // 写入字符串长度 + 1(包括'\0')
  47.         if (ret == -1) {
  48.             perror("write failed");
  49.             close(fifo_fd);
  50.             return -1;
  51.         }
  52.         // 关闭管道
  53.         close(fifo_fd);
  54.         // 等待子进程完成
  55.         wait(NULL);
  56.     } else if (child_pid == 0) {
  57.         // 子进程:以读模式打开管道
  58.         fifo_fd = open("./fifo2", O_RDONLY);
  59.         if (fifo_fd == -1) {
  60.             perror("open fifo failed");
  61.             return -1;
  62.         }
  63.         // 从管道读取数据
  64.         ret = read(fifo_fd, buffer1, sizeof(buffer1) - 1);
  65.         if (ret == -1) {
  66.             perror("read failed");
  67.             close(fifo_fd);
  68.             return -1;
  69.         }
  70.         // 确保字符串以空字符结尾
  71.         buffer1[ret] = '\0';
  72.         // 输出读取的数据
  73.         printf("%s\n", buffer1);
  74.         // 关闭管道
  75.         close(fifo_fd);
  76.     } else {
  77.         perror("fork failed");
  78.         return -1;
  79.     }
  80.     return 0;
  81. }
  82. ````
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册